一个令人寻味的JavaScript代码..

by_封爱 2014-01-13 03:12:06

var aNumber = 100;
tweak();
function tweak()
{
alert(aNumber);
if (false)
{
var aNumber = 123;
}
}


先来目测下.然后测试下.然后说明下...why
...全文
490 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
x5688 2014-01-14
  • 打赏
  • 举报
回复
引用 24 楼 bigbaldy 的回复:
[quote=引用 19 楼 elgin_hou 的回复:] 请看。
学习了,非常感谢![/quote] 哇噻,好强大,学习了。这是什么书上的吖。
泡泡鱼_ 2014-01-14
  • 打赏
  • 举报
回复
引用 25 楼 Return_false 的回复:
如果你清楚在作用域内 js解释器至少会做两件事情 1.预解析 2.逐行读代码 就不会有类似的疑问了 哪怕是下面这种只有在原理分析时才会出现的情况就不难分析了,但是如此情况在正常工作中是可以通过代码规范来避免的
alert(a);//function a(){alert(20);}
var a=1;
alert(a);//1
function a()
{
	alert(10);
}
alert(a);//1
a=4;
function a()
{
	alert(20);
}
a();//报错
呃,#25 Return_false说得很清楚了 因为预解析时的优先级:函数表达式定义前置,函数内的局部变量会优先申明
泡泡鱼_ 2014-01-14
  • 打赏
  • 举报
回复
因为解析器预编译的问题,其等效于:
var aNumber = 100; 
tweak(); 
function tweak(){ 
   var aNumber;
   alert(aNumber); 
   if (false) 
   { 
     aNumber = 123;   
   } 
}
所以,后面的if可以直接无视它,影响不到结果
nvllin1992 2014-01-14
  • 打赏
  • 举报
回复
undefined 我也弹出个这
  • 打赏
  • 举报
回复
如果你清楚在作用域内 js解释器至少会做两件事情 1.预解析 2.逐行读代码 就不会有类似的疑问了 哪怕是下面这种只有在原理分析时才会出现的情况就不难分析了,但是如此情况在正常工作中是可以通过代码规范来避免的
alert(a);//function a(){alert(20);}
var a=1;
alert(a);//1
function a()
{
	alert(10);
}
alert(a);//1
a=4;
function a()
{
	alert(20);
}
a();//报错
bigbaldy 2014-01-13
  • 打赏
  • 举报
回复
引用 19 楼 elgin_hou 的回复:
请看。
学习了,非常感谢!
ltcszk 2014-01-13
  • 打赏
  • 举报
回复
基础中的基础啊,闭包都不懂的话,this不就更搞了吗
7年 2014-01-13
  • 打赏
  • 举报
回复
引用 19 楼 elgin_hou 的回复:
请看。
学习了
elgin_hou 2014-01-13
  • 打赏
  • 举报
回复


请看。
blue_apple2006 2014-01-13
  • 打赏
  • 举报
回复

<script>
        var aNumber = 100;
        tweak();
        function tweak() {
            alert(aNumber);
            if (false) {
                var aNumber = 123;
            }
          //  alert(aNumber);
        }

    </script>
加上注释的这行就能明白了,局部变量放置在栈上,和声明的位置没关系。
blue_apple2006 2014-01-13
  • 打赏
  • 举报
回复
这不是闭包吗?争什么呢?去看看闭包原则。
md5e 2014-01-13
  • 打赏
  • 举报
回复
<script> var a = 1; $(document).ready(function () { $(".btn1").click(function () { if (1 == 1) { var a = 2; } alert(window.a); }); }); </script> 这样是可以的
md5e 2014-01-13
  • 打赏
  • 举报
回复
引用 12 楼 diaodiaop 的回复:
[quote=引用 11 楼 liuchaolin 的回复:] ...
1==1或者true的情况下 是正常的 我现在要问 为什么1==2或者false弹出的 是undefined[/quote] 只要在function()中有var a ,不管他有没有真正去定义,都不可以再去识别外围的a
凤凰涅檠 2014-01-13
  • 打赏
  • 举报
回复
javascript 让人又怕又爱的。。。
by_封爱 2014-01-13
  • 打赏
  • 举报
回复
正常情况下

if(false)
{
   //code
}
这里面的代码 根本不执行吧....但是加上之后 在弹出a就不对了..
by_封爱 2014-01-13
  • 打赏
  • 举报
回复
引用 11 楼 liuchaolin 的回复:
...
1==1或者true的情况下 是正常的 我现在要问 为什么1==2或者false弹出的 是undefined
md5e 2014-01-13
  • 打赏
  • 举报
回复
做程序不是让程序去理解我们的思维,而是让我们的思维能让程序可以理解
md5e 2014-01-13
  • 打赏
  • 举报
回复
$(document).ready(function () { var a = 1; $(".btn1").click(function () { if (1 == 1) { var a = 2; } alert(a); }); });
by_封爱 2014-01-13
  • 打赏
  • 举报
回复
现在就是这样.也别说位置的问题 也别说var的问题

$(document).ready(function(){
    var a=1;
    $(".btn1").click(function(){
    if(true)
    {
         var a=2;
    }
    alert(a);
   });
});
弹出2

$(document).ready(function(){
    var a=1;
    $(".btn1").click(function(){
    if(false)
    {
         var a=2;
    }
    alert(a);
   });
});
弹出Undefined
手抓宝 2014-01-13
  • 打赏
  • 举报
回复
nnd,vpn果然不靠谱。还得是我大3G 我是说显式声明的变量在预编译的时候就被编译到了调用对象中去了。
加载更多回复(7)

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧