因为我在写这篇文章的时候,在百度上找资料,发现了一个园林朋友的文章,写得不错,但是写完之后又不想放弃,所以里面拿了很多东西!~ ~[翻译]JavaScript范围界定和提升希望得到大家的理解。一个。在犯罪现场,我们首先看一个非常简单的代码:复制代码如下: var v=' Hello World警报(v);毫无疑问,弹出“你好世界”。好,我们继续。我们正在看一段代码:复制代码如下: var v=' Hello World(function(){ alert(v);})()跑完之后,我们发现“Hello World”如我们所料弹出来了。好了,有趣的事来了。然后看下面的代码:复制代码如下: var v=' Hello World(function(){ alert(v);var v='我爱你';})()如果这是面试问题,结果如何?你怎么回答?先看看结果吧!
结果未定义?和你上面想的一样吗?嗯,我不会故弄玄虚。其实里面隐藏着一个陷阱——变量吊装);在JavaScript中;两个。深度分析现在让我解释一下提升意味着什么。顾名思义,就是上面提到的以下事情。在JS中,后面定义的(变量或函数)提升到前面的定义。在解释推广之前,让我们看看js中的范围问题。范围是JavaScript初学者最困惑的部分之一。其实不仅仅是新手,我遇到的很多有经验的JavaScript程序员都不能完全理解作用域。JavaScript作用域如此复杂的原因是它看起来非常像C语言的一员。参见下面的c程序:复制代码如下: # includes dio . h int main(){ int x=1;printf('%d ',x);//1 if(1){ int x=2;printf('%d ',x);//2 } printf('%dn ',x);//1}这个程序的输出是1,2,1。这是因为C语言中有块级作用域。当进入一个块时,就像if语句一样,新的变量将在这个块级范围内声明,这些变量不会影响外部范围。但JavaScript不是这样。在Firebug中尝试以下代码:复制代码如下: var x=1;console . log(x);//1 if(true){ var x=2;console . log(x);//2 } console . log(x);//2在这段代码中,Firebug显示1,2,2。这是因为JavaScript是一个函数级的作用域。这与C语言完全不同。块,就像if语句一样,不会创建新的作用域。只有函数会创建一个新的作用域。对于大多数熟悉C、C、C#或Java的程序员来说,这是意想不到的,也是看不到的。幸运的是,由于JavaScript函数的灵活性,我们有了解决这个问题的方案。如果必须在函数中创建临时作用域,请执行以下操作:复制代码如下: function foo(){ var x=1;if(x){(function(){ var x=2;//其他一些代码}();} //x仍然是1。}这个方面真的很灵活,只要需要创建临时范围,就可以使用它,而不仅仅是在一个块中。但是,我强烈建议您花一些时间来理解JavaScript的作用域。它非常强大,也是我最喜欢的语言功能之一。如果你对范围有很好的理解,就更容易理解吊装。2.1变量提升变量提升很简单,就是把变量提升的地方提到函数的顶部。我需要说明的是,变量提升只是提升变量的声明,不会提升赋值。比如我们定义了三个变量:复制代码为:(function(){ var a=' One ';var b=' Twovar c='三';})()其实看起来是这样的:复制代码如下: (function(){ var a,b,c;a='一';b='二';c='三';})()此时,变量已升级。好,让我们回到代码的第一段。为什么要报告错误?其实根据我们根据上面的变量和js的作用域(块级作用域)对原代码进行升级的分析,我们知道上面的代码真的变成了如下:复制代码的代码如下: var v=' Hello World(function(){ var v;警报(v);v=‘我爱你’;})()所以,会提示你说“未定义”。从这里,我们还了解到,在编写js代码时,我们需要将变量放在块级范围的顶部,比如我上面举的例子:var a、b、c;预防事故。2.2功能提升功能提升就是把整个功能带到最前面。当我们编写js代码时,我们有两种方法,一种是函数表达式,另一种是函数声明。需要注意的是,只能提升函数声明的形式。
函数声明模式得到改进[成功]。复制代码如下:函数myTest(){ foo();Function foo(){ alert('我来自foo ');} } MyTest();函数模式提升[失败]复制代码如下:函数myTest(){ foo();Var foo=function foo(){ alert('我来自foo ');} } MyTest();结果如下:。
左边是错误的报告。没有骗你。应该在这里基本上可以理解。~呵呵。再次感谢贝塔兔。兰尼兰蔡东著。