命名函数表达式不会预先提升

使用JavaScript时,当你这样调用函数是没有问题的

1 func1();
2 function func1() {
3     console.log(‘func1‘);
4 }
5 func1();

如果你这样

1 func2(); // Uncaught TypeError: func2 is not a function
2
3 var func2 = function () {
4     console.log(‘func2‘);
5 }
6
7 func2();

在第一行就会得到func2 is not a function的错误。因为上面的代码和下面是等价的

1 var func2;
2
3 func2(); // Uncaught TypeError: func2 is not a function
4
5 func2 = function () {
6     console.log(‘func2‘);
7 }
8
9 func2();

func2只是声明了,但并没有被赋值,也就是说,第3行调用语句出现时,func2的值还是undefined!因此,浏览器报错说“func2不是一个函数”。

总结:不同于直接声明函数的形式,函数表达式不会预先提升。

(完)

时间: 2024-11-06 03:30:39

命名函数表达式不会预先提升的相关文章

[Effective JavaScript 笔记] 第14条:当心命名函数表达式笨拙的作用域

js函数会根据上下文改变其含义. function double(x){return x*2;} 这是一个函数声明,也可以是一个命名函数表达式(named function expression),取决于它出现的地方. 声明一个函数,并绑定一个当前作用域的变量. 同一段函数代码也可以作为一个表达式. var f=function double(x){return x*2;} 根据ECMAScript规范,该函数绑定到变量f,而不是变量double.这里给函数表达式命名并不是必要的的,可以直接使用

命名函数表达式的名字和函数声明的名字

1 var s = 0, 2 b = 0; 3 function A(s) { 4 A = function () { 5 console.log(s + b++); 6 }; 7 console.log(A); 8 console.log(s++); 9 } 10 A(1); 11 A(2); 12 console.log(delete A); 13 A(2); A作为全局对象的一个属性,值为一个函数的引用,当执行A函数时,将一个匿名函数传给A,此时会进行作用域链查找,在全局对象中找到了A,然

深入理解JavaScript系列(2):揭秘命名函数表达式

前言 网上还没用发现有人对命名函数表达式进去重复深入的讨论,正因为如此,网上出现了各种各样的误解,本文将从原理和实践两个方面来探讨JavaScript关于命名函数表达式的优缺点. 简单的说,命名函数表达式只有一个用户,那就是在Debug或者Profiler分析的时候来描述函数的名称,也可以使用函数名实现递归,但很快你就会发现其实是不切实际的.当然,如果你不关注调试,那就没什么可担心的了,否则,如果你想了解兼容性方面的东西的话,你还是应该继续往下看看. 我们先开始看看,什么叫函数表达式,然后再说一

深入理解JavaScript系列(2):揭秘命名函数表达式(转)

前言 网上还没用发现有人对命名函数表达式进去重复深入的讨论,正因为如此,网上出现了各种各样的误解,本文将从原理和实践两个方面来探讨JavaScript关于命名函数表达式的优缺点. 简 单的说,命名函数表达式只有一个用户,那就是在Debug或者Profiler分析的时候来描述函数的名称,也可以使用函数名实现递归,但很快你 就会发现其实是不切实际的.当然,如果你不关注调试,那就没什么可担心的了,否则,如果你想了解兼容性方面的东西的话,你还是应该继续往下看看. 我们先开始看看,什么叫函数表达式,然后再

<深入理解JavaScript>学习笔记(2)_揭秘命名函数表达式

写在前面的话 注:本文是拜读了 深入理解JavaScript 之后深有感悟,故做次笔记方便之后查看. 感觉这章的内容有点深奥....略难懂啊. 先坐下笔记,加深一下印象吧. 我主要记一下自己感觉有用的东西...哈哈 函数表达式和函数声明 在ECMAScript中,创建函数的最常用的两个方法是函数表达式和函数声明,两者期间的区别是有点晕,因为ECMA规范只明确了一点:函数声明必须带有标示符(Identifier)(就是大家常说的函数名称),而函数表达式则可以省略这个标示符: 函数声明: funct

深入理解javascript:揭秘命名函数表达式

这是一篇转自汤姆大叔的文章:http://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html 前言 网上还没用发现有人对命名函数表达式进去重复深入的讨论,正因为如此,网上出现了各种各样的误解,本文将从原理和实践两个方面来探讨JavaScript关于命名函数表达式的优缺点. 简单的说,命名函数表达式只有一个用户,那就是在Debug或者Profiler分析的时候来描述函数的名称,也可以使用函数名实现递归,但很快你 就会发现其实是不切实际的.当然

命名函数表达式探秘

函数表达式与函数声明 在ECMAScript中,有两个最常用的创建函数对象的方法,即使用函数表达式或者使用函数声明.这两种方法之间的区别可谓 相当地令人困惑:至少我是相当地困惑.对此,ECMA规范只明确了一点,即函数声明 必须始终带有一个标识符(Identifier)——也就是函数名呗,而函数表达式 则可省略这个标识符: 函数声明: function Identifier ( FormalParameterList opt ){ FunctionBody } 函数表达式: function Id

Javascript高级程序设计——this、闭包、函数表达式

在javascript中函数声明会被提升,而函数表达式不会被提升.当函数执行时,会创建一个执行环境和相应的作用域链,然后利用arguments和其他的命名参数的值来初始化函数的活动对象,作用域链链中所有的外部活动对象都处于第二的位置. function compare(num1, num2){ if(num1 < num2){ retunr -1; } else if(num1 = num2){ retunr 0; } else(num1 > num2){ retunr 1; } } var

7章 函数表达式

定义函数的两种方式 函数声明 function functionName(arg0, arg1,arg2){     //函数体 } //非标准的name属性 //只在Firefox.Safari.Chrome和Opera有效 alert(functionName.name);    //'functionName' 特点: 函数声明提升(执行代码之前会先读取函数声明,因此可以把函数声明放在调用它的语句后面): 不能出现在判断.循环等位置. 函数表达式 //匿名函数(拉姆达函数) var fun