对一个分号激发的毛病研讨

题目

碰到了一个很诡异的题目,函数明显定义了,却报错说函数没定义,代码以下:

jsvar x = 0;
var foo = function(callback){
  return window.setTimeout(callback, 17);
}  
(function sayX(){
  x += 1;
  console.log(x);
  foo(sayX);
}())

报错信息: Uncaught TypeError: foo is not a function
测试环境: chrome 44.0.2403.130 m

处理

厥后经由发问,和查找材料, 也许邃晓了个中的启事,故写此文。

这个题目涉及到一个“自动分号插进去”,详细到这个题目,就是:
1. 函数声明自动插进去引号;
2. 函数表达式不会自动插进去分号;

function foo() {
}  // 函数声明会自动增加分号,不需要增加分号

var foo = function() {
}; // 函数表达式不会自动增加分数,最好增加分号

详细到这个题目,因为foo 函数表达式背面没有分号,因而代码等价于:

jsvar x = 0;
var foo = function(callback){
  return window.setTimeout(callback, 17);
}(function sayX(){
  x += 1;
  console.log(x);
  foo(sayX);
}())

插播一条知识点:
函数表达式背面跟括号就会对触发函数实行,比方

var foo = function(x){
  return x;
}(10)  

终究 foo 的值是 10 ,而不是函数

回到这个题目, 自挪用函数会首先取值, 然后传入函数求值,返回给foo。
但自挪用函数求值过程当中碰到 foo(sayX)时,foo还没有值,所以会报Uncaught TypeError: foo is not a function的毛病。

此时,水落石出。

感悟

不要省略分号.

谢谢

  1. http://segmentfault.com/q/1010000003074238
  2. http://justjavac.iteye.com/blog/1852405
    原文作者:杨军军
    原文地址: https://segmentfault.com/a/1190000003075043
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞