JS里的函数
JavaScript里面共有七种数据类型,分别为number
、string
、boolean
、symbol
、undefined
、null
、object
。而函数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
潜规则:普通模式下,如果this
是undefined
,浏览器会自动把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
共同学习,写下你的评论
评论加载中...
作者其他优质文章