资讯专栏INFORMATION COLUMN

对一个分号引发的错误研究

khs1994 / 2186人阅读

摘要:问题碰到了一个很诡异的问题,函数明明定义了,却报错说函数没定义,代码如下报错信息测试环境解决后来经过提问和查找资料大概明白了其中的缘由,故写此文。但自调用函数求值过程中遇到时,还没有值,所以会报的错误。此时,真相大白。感悟不要省略分号感谢

问题

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

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的错误。

此时,真相大白。

感悟

不要省略分号.

感谢

http://segmentfault.com/q/1010000003074238

http://justjavac.iteye.com/blog/1852405

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/85882.html

相关文章

  • JavaScript-总结常用代码书写规范

    摘要:函数声明应该在作用域的顶层。数组和对象字面量用数组和对象字面量来代替数组和对象构造器。数组构造器很容易让人在它的参数上犯错。推荐对象构造器不会有类似的问题,但是为了可读性和统一性,我们应该使用对象字面量。 javascript 代码规范 代码规范我们应该遵循古老的原则:能做并不意味着应该做。 全局命名空间污染 总是将代码包裹在一个立即的函数表达式里面,形成一个独立的模块。 不推荐 va...

    Berwin 评论0 收藏0
  • Coding Standard

    摘要:函数声明应该在作用域的顶层。数组和对象字面量用数组和对象字面量来代替数组和对象构造器。数组构造器很容易让人在它的参数上犯错。推荐对象构造器不会有类似的问题,但是为了可读性和统一性,我们应该使用对象字面量。 Coding Standards 转载自掘金 作者:Sivan 简介:前端开发的老新人,原生JavaScript的爱好者,致力做一名专业的开发者 javascript 代码规范 ...

    xiaochao 评论0 收藏0
  • 【知识点】Javascript分号规则

    摘要:花点时间搞清楚中的分号规则吧不管你喜欢结尾带分号或省略分号的模式分号允许的场景分号一般允许出现在大部分语句的末尾,比如等栗子仅有一个分号可以表示空语句在中合法,比如可解析为三个空语句空语句可用于辅助产生语法合法的解析结果,如如果没有末尾的 花点时间搞清楚JS中的分号规则吧~~~不管你喜欢结尾带分号或省略分号的模式 分号允许的场景 分号一般允许出现在大部分语句(statement)的末尾...

    kun_jian 评论0 收藏0
  • JavaScript 编写规范

    摘要:如果你想了解更多关于强制类型转换的信息,你可以读一读的这篇文章。在只使用的情况下,所带来的强制类型转换使得判断结果跟踪变得复杂,下面的例子可以看出这样的结果有多怪了明智地使用真假判断当我们在一个条件语句中使用变量或表达式时,会做真假判断。 说明 如果本文档中有任何错误的、不符合行规的,敬请斧正。 引言 不管有多少人共同参与同一项目,一定要确保每一行代码都像是同一个人编写的。...

    MartinDai 评论0 收藏0
  • 惊爆!一行正则表达式引发 CPU 惨案

    摘要:我将上面校验的正则表达式的第二部分后面加多了个号,即变成这样这里加了个号这样之后,运行原有的程序就没有问题了。 正则表达式是程序员经常使用的工具之一。本文作者通过一个正则表达式的陷阱,先深入剖析了出现问题的原因,后给出怎么处理这类问题的方法。最后还给出了一些检测常见正则表达式问题的工具,十分值得深入研究。前几天线上一个项目监控信息突然报告异常,上到机器上后查看相关资源的使用情况,发现 CPU...

    Faremax 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<