2017-04-12 63 views
2

请解释这个给我,为什么我得到0而不是5奇怪的结果与typeof和undefined

内的HTML文件:

<script> 
    var x = 5; 
</script> 
<div id="dv"></div> 

里面的JS文件:

$(function() { 
    if(typeof x == 'undefined') { 
    var x = 0; 
    $("#dv").html(x); 
    } else if (x == 5) { 
    $("#dv").html(x); 
    } 
}); 

缺少什么我在这里?

+0

你在哪里加载JS文件?在你分配'x'的脚本标签之前或之后? – Ozan

+5

当然,在之前装入'x = 5'的代码之前,它会在IIFE – gurvinder372

+0

@Ozan中提升'var x' – blowz

回答

0

因为variable hoisting in Javascript脚本是,就好像它是:

$(function() { 
    var x; 
    if(typeof x == 'undefined') { 
    x = 0; 
    $("#dv").html(x); 
    } else if (x == 5) { 
    $("#dv").html(x); 
    } 
}); 

所以x总是不等于undefined所以它永远不会将其设置为0。请注意,函数中的变量x与页面中的变量x是不同的变量。这是因为脚本中的变量是closed over进入功能范围。


如果我理解你的问题正确的我会做这种方式:

<body data-x="5"> 
... 
<div id="dv"></div> 

$(function() { 
    var x; 
    if(typeof $('body').data('x') !== 'undefined') { 

    $("#dv").html($('body').data('x')); 
    } else { 
    $("#dv").html(0); 
    } 
}); 
+0

谢谢。那么这有什么解决方法 - 或者这仅仅意味着我将无法在调用函数内部使用'x = 5'的'x'?因为如果我从调用函数中删除'var',它确实可以工作 – blowz

+0

TBH这里你的实际问题是什么?为什么x不能被定义?这整个事情是一个[XY问题](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) – Liam

+0

hehe :)嗯,我试图操纵结果取决于我得到的动态变量。然后我想检查结果。所以,如果我得到'x = undefined',我想将它定义为'0',如果它在页面上定义为'x = 1',我想使用'if else'语句来输出一些特定的结果。如果它与'x = 1'完全一样,但输出不同 – blowz