为什么JavaScript提升variables? 对于这个语言的devise者来说,他们决定实施提升的好处是多么重要? 我想不出任何其他的stream行语言。
JavaScript程序由语句和函数声明组成。 在执行JavaScript程序时,会发生以下两个步骤: 对代码进行函数声明和每个函数的扫描。 声明是“执行”的(通过创build一个函数对象)并且创build了一个对该函数的命名引用(这样这个函数可以从一个语句中调用) 语句按顺序执行(评估)(如代码中所示) 因此,这工作得很好 : <script> foo(); function foo() { return; } </script> 虽然“foo”函数在声明之前被调用,但它的工作原理是函数声明在声明之前被计算。 但是,这不起作用 : <script> foo(); </script> <script> function foo() { return; } </script> ReferenceError将被抛出(“foo未定义”)。 这导致了这样的结论:网页的HTML代码中的每个SCRIPT元素表示单独的JavaScript程序,并且每当HTML分析器遇到SCRIPT元素时,它就执行该元素内的程序(然后一旦程序被执行,parsing器转到HTML代码后面的SCRIPT元素)。 然后再次,这工作 : <script> function foo() { return; } </script> <script> foo(); </script> 我的理解是Global对象(作为全局执行上下文中的Variable对象)始终存在(并保留),所以第一个JavaScript程序将创build函数对象并为其创build引用,然后第二个JavaScript程序将使用该引用来调用该函数。 因此,所有JavaScript程序(在单个网页中)“使用”相同的全局对象,所有JavaScript程序所做的所有更改都可以被后续运行的所有JavaScript程序观察到。 现在,注意这个… <script> // assuming that foo is not defined foo(); alert(1); […]
我遇到了JavaScript'提升',我没有弄清楚这段代码是如何运作的: var a = 1; function b() { a = 10; return; function a() {} } b(); alert(a); 我知道函数声明( function a() {} )将被提升到函数b作用域的顶部,但它不应该覆盖a的值(因为函数声明覆盖variables声明而不是variables初始化),所以我预计警报的价值将是10而不是1!
alert(myVar1); return false; var myVar1; 以上代码在IE,FF和Opera中抛出错误,说明返回语句必须在函数中。 但它在Safari和Chrome中起作用(显示undefined )。 上面的代码已经在全球范围内编写了。 除了所有的function。 任何原因?