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=1
f(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=1
function f1(){
alert(a) //结果是多少
var a=2
}
f1.call
答案: undefined
第二道:
var a=1
function f1(){
var a=2
f2.call()
}
function f2(){
console.log(a) //结果是多少
}
f1.call()
答案:1
第三道:
var LiTags=document.querySelectorAll('li') //说明一下:html页面中存在着6个li
for (let i=0;i<liTags.length;i++) {
LiTags[i].onclick=function(){
console.log(i) //点击第三个li,打印的结果为多少?
}
}
答案:6
网友评论