函数声明 及 名称问题
题目:
var f = function g(){
return ‘something'
}
typeof g()
考察点如下:
一 函数定义的方式 有三种:
(1 )函数声明式 :函数被声明为一个命名函数
function f(){
...
}
f.name // "f"
在js代码中,函数会被提前声明到作用域顶部, 名称f 在作用域内是 全局访问的
(2 )函数表达式赋值式 : 创建一个匿名函数(或者有名函数),并赋值给一个变量
var f = function(){
...
}
//f.name 在es5下为 “” ,在es6下为 "g"
var f = function g(){
...
}
//f.name 在es5下为 “g” ,在es6下为 "g"
// 此处的函数名称 g只能在函数体内访问
等号右侧的函数表达式赋值给了左侧的变量f,名称f 只有在声明后,才能访问,否则为undefined
(3)Function()构造函数
var f = new Function("x","y","return x+y"); //Function()构造函数
二 函数名称问题
所有的函数都有一个name
属性,该属性保存的是该函数名称的字符串。
- 函数被声明为一个命名函数
这种情况ES5和ES6语法一致,name
属性返回该函数的函数名。
function g(){}
// es5 es6 下g.name 均为 ’g'
- 创建一个匿名函数,并赋值给一个变量
在ES5中,该函数的name
属性为“”,而 ES6 的name
属性会返回实际的函数名
var f = function(){}
// es5
f.name // ""
// es6
f.name // "f"
- 创建一个匿名函数,将其赋值给一个
window
的属性
在ES5中,该函数的name
属性返回函数名(window下的赋值属性名),而 ES6 的name
属性会返回“”
window.f = function () {};
// ES5
f.name // "f"
// ES6
f.name // ""
- 创建一个命名函数,将其赋值给一个变量或
window
下的属性
这种情况ES5和ES6语法一致,name
均返回函数的字面量名称,与将函数进行赋值的变量或属性名称无关
var f = function g() {
console.log(arguments.callee === g) // true
};
// ES5
f.name // "g"
// ES6
f.name // "g"
window.f = function g() {};
// ES5
f.name // "g"
// ES6
f.name // "g"