JavaScript 函数内部属性 name
先看一道有关函数的题目
var f = function g() {
return 23;
};
typeof g();
输出结果为 Uncaught ReferenceError: g is not defined;
分析:
首先在 JavaScript 中,定义函数有两种方式:
- 声明式,如
function father(){}
- 表达式,如
let son = function(){}
在表达式定义函数中,使用的是匿名函数,即 function 后面没有加上函数名,
是常用的函数定义方式,而在这道题中使用的 function g() 是命名函数,所以第一次
看到这道题感觉陌生。
函数是对象,函数名即为指向这个对象的指针,ES6 中每个函数对象都会暴露出一个只读属性 name ,这个属性保存的就是一个函数标识符。
// 匿名函数
let father = function bar(){};
等同于
let father = {
name:bar
/* ...函数其他属性 */
}
//father.name // 'bar'
//命名函数
let father = function(){};
等同于
let father = {
name:father //ES6 中为函数名
//name:'' //ES5 中为 ''
/* ...函数其他属性 */
}
//father.name // 'father'
(() => {}).name //''
再来看那道题就可以明白了
var f = function g() {
return 23;
};
typeof g // 'undefined' 此时的 b 看成一个变量,相当于在全局上下文中寻找 g,最终发现没有定义,返回 'undefined'
typeof g() // Uncaught ReferenceError: g is not defined; 报错,把 g() 看成一个函数,函数调用"()"的运算优先级高于typeof,
//所以先解析g()的情况下,js直接报错,而不是给出"undefiend";。