为了账号安全,请及时绑定邮箱和手机立即绑定

JS里的函数

标签:
JavaScript

    JavaScript里面共有七种数据类型,分别为numberstringbooleansymbolundefinednullobject。而函数function其实是一种特殊的object对象,因此他也同时具备着一些对象共有的属性和方法。

    首先这里讲一下在JS里声明函数的五种方式:

1.声明具名函数

function x(输入1,输入2) {    return undefined}

    在这里值得一提的是,这里的function是关键字,和声明变量时候的var类似。
    这里x为函数名,console.log(x)可以打印出函数的字符串形式。
    另外,函数最后不写return的话,函数会自动return undefined

2.声明匿名函数

var x
x=function (input1,input2) {    return undefined}


3.声明具名函数赋值于变量中

var x
x=function y(input1,input2) {    return undefined}

    这种声明出来的函数与直接声明具名函数的区别:

function y(){}console.log(y) //打印出函数//--------------刷新页面--------------var x=function y(){}console.log(y) //报错,没有定义y

    这是一种不一致的情况,是一个JS里面的BUG

4.使用window.Function来构造函数

var f=new Function('x','y','return x+'+n+'+y')var n=1f(1,2) //4


5.使用箭头函数来构造函数

var f=(x,y)=>{return x+y}
f(10,2) //12

    在这里值得注意的是,这种办法构造出来的函数是匿名函数,因此需要赋值给变量f
    另外,如果函数主体只有一句话且不是返回对象的时候,可以去掉花括号和return

var f=(x,y)=> x+y
f(1,2) //3

    若输入参数只有一个,可以去掉圆括号。

var n2 = n => n*n
n2(4) //16


函数的name属性

    函数拥有name属性,不同的函数声明方式可能会导致name属性得出的结果不一样。

    具体如下面代码所示:

function f(){}
f.name // "f"var f2=function (){}
f2.name // "f2"var f3=function f4(){}
f3.name // "f4"var f5=new Function('x','y','return x+y')
f5.name //anonymous(匿名的)var f6=(x,y)=>{return x+y}
f6.name // "f6"


函数的call、this和argument

    在JavaScript中,变量是可以直接用的,而函数则需要调用(call),所以说函数就是一段可以反复调用的代码块。

    我们可以尝试通过创建一个对象来代替函数:

var f={}
f.name='f'f.params=['x','y']
f.functionBody='console.log("fff")'f.call=function(){    return window.eval(f.functionBody) //eval('字符串'),该方法可以把字符串当代码执行}

    从上面代码可以看出,可以执行代码的对象就是函数。
    可能看到这里会有人疑惑为什么调用函数的时候要用call方法来调用,其实call来调用函数才是真正的调用方法,而之所以可以不用call调用函数,是JavaScript编写这门语言的时候所留下的给使用者的“糖”,是用来吸引更多的人来使用这门语言。但是其实用call来调用函数才是真正正确的调用方法,是硬核(hardcored)。

function f(x,y){return x+y}
f.call(undefined,1,2)

    上述代码中:
    call后面的第一个参数可以通过this得到,即传入的第一个参数被存入了到了关键字this中。
    call后面的除第一个参数以为的其他参数被传入到了一个关键字为argument的伪数组中。

f=function(){    console.log(this)
}
f.call(undefined) // window{...}//启用严格模式以后:f=function(){  'use strict'
  console.log(this)
}
f.call(undefined) // undefined

    潜规则:普通模式下,如果thisundefined,浏览器会自动把this变成一个window对象,只有启用了严格模式之后,this才为undefined,启用严格模式的方法:在函数第一行中输入'use strict'


最后我们来说几道面试题以及面试题的答案:

第一道:

var a=1function f1(){
    alert(a) //结果是多少
    var a=2}
f1.call

答案: undefined

第二道:

var a=1function f1(){    var a=2
    f2.call()
}function f2(){    console.log(a) //结果是多少}
f1.call()

答案:1

第三道:

var LiTags=document.querySelectorAll('li') //说明一下:html页面中存在着6个lifor (let i=0;i<liTags.length;i++) {
    LiTags[i].=function(){        console.log(i) //点击第三个li,打印的结果为多少?
    }
}

答案:6



作者:宣泽彬
链接:https://www.jianshu.com/p/bec596e43c44


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消