函数声明 及 名称问题

题目:

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"
posted @ 2018-08-27 14:15  a fine day  阅读(156)  评论(0编辑  收藏  举报