首页 > JS中函数表达式只会提升声明不会提升函数定义,这样如果喜欢用函数表达式而非函数声明,但是调用顺序和定义顺序错乱时不是很蛋疼吗?

JS中函数表达式只会提升声明不会提升函数定义,这样如果喜欢用函数表达式而非函数声明,但是调用顺序和定义顺序错乱时不是很蛋疼吗?

函数声明不仅会提升声明,还会提升定义,如下

foo() // 调用成功
function foo() {} 

而函数表达式只会提升声明,不会提升定义,如下

foo()  // 有foo这个变量,但它却不是函数,所以调用失败
var foo = function() {}

如果喜欢用函数表达式,这不是很蛋疼吗?还要注意调用和定义出现的顺序?


你已经明白了声明提升的概念,只是感到很不习惯,怕一怕留神就出错,对吧?

我建议你在写代码的时候,使用代码检查工具,JSLint和JSHint。
比如你看下面的截图

顺序写错了,会用红颜色的出错信息给你提示,告诉你:
调用的地方:'a' was used before it was defined
定义的地方:Unused 'a'

两个工具都不错,你可以比较下两个的区别,选择一个你喜欢的,总的说,就是JSHint可配置性更好的。
我在写代码时,是两个都用的。
我觉得很不错,不仅可以检查可能出错的地方,也可以让代码风格更规范

如果还没开始用,大概学下,很好用的


是很蛋疼, js 设计的不好处之一.


按道理来讲函数的提升是优于变量的提升的,但是之前看到的确实是函数表达式函数不会被提升,然而今天看javascript语言精粹上讲 function不管放在哪里都会被移动到被定义的最顶层 ,有点疑惑


我觉得用requirejs、seajs、browserify和webpack等可以解决这个问题。总来说就是模块化,如果出现大量你所说的问题,很有可能是解耦没有做好。
如commonjs:

util.js

exports.foo = function(name) {
    console.log('function foo');
}

main.js

var u = require('util');
u.foo();

在《编写可维护的JavaScript》中提到, JavaScript代码最好是保持这样的结构。
在一个函数作用域内

(function(){ 
    1. var 的各种变量声明
    2. 通用工具函数的声明。
    3. ....
})();

当然书上推荐这种写法肯定是有他的道理的。
第一点就是楼上面提到的函数声明与函数定义。JavaScript预解析会解析整个代码中使用var和function的地方。 所以在代码的任何地方调用这些输出要么是undefined, 要么就已经被赋给了值。所以将所有会被编译器预编译的代码都写在代码的最前头, 既可以很清晰的让读代码的人清楚在这个作用域内有哪些函数与变量, 也方便在控制台进行调试。 也可以防止程序员在编写代码的时候, 不小心再次定义了名字相同的函数或者变量。 而且重复定义不报错, 只会覆盖之前的。


其实 就是尽早生命比较好


应该就是这样吧。
有一本术里说:
可以把变量的声明行为理解成两部分:声明和赋值。js隐式的将变量的声明提升到函数顶部,而赋值留在原地。

至于这两种函数声明方式,也套用一篇文章里说的:
JS解析器会在预解析阶段优先读取函数声明的代码,以确保函数能够被引用到;而对于函数表达式,只有在执行到相应的语句时才进行解析。


听说 C 定义一个函数先要在前面声明这个函数,其中还要定义好函数的返回类型,还要定义参数的参数类型,然后才能在后面定义这个函数。如果用惯了 JS,这不是很蛋疼吗?还要注意预先定义和参数类型?

好吧,上面只是个玩笑话而已啦。声明提前这个算是 JS 的 feature 吧,如果你实在不习惯的话就老老实实的都在前面写呗。


正確使用語言的特性永遠不會蛋疼。

喜歡自找麻煩要是不蛋疼難道不奇怪嗎?

在模塊內部永遠先定義後使用,在模塊間永遠用通用模塊解決方案處理順序錯亂,over

【热门文章】
【热门文章】