在函数内声明的'var'的范围是什么?

时间:2012-09-06 17:12:43

标签: javascript jquery

有人可以为我澄清吗...我已经读过使用保留字'var'创建一个变量会使该变量公开但如果变量是在函数内部创建的,那怎么可能呢?

$('#timeIn').timepicker({ 'scrollDefaultNow': true });
    $('#timeIn').on('change', function() {
        var numIn = $('#timeIn').timepicker(('getSecondsFromMidnight'));
        var inHours = {
            hours: (numIn/86400)*24,
            getter: function() {return this.hours;}
        };
        timeIn = $('#timeIn').val();
        inArray.push(timeIn);
        events.push(timeIn);
});

在这个例子中,变量numIn& inHours只在那个onChange方法中知道,对吗?如果是这种情况,全局声明会是什么样子? 'timeIn'是全局范围的但没有操作我只返回一个字符串表示。有什么选择可以将可计算的时间作为回报。

3 个答案:

答案 0 :(得分:10)

在函数中使用单词var将其绑定到该函数的作用域。

不使用单词var使其在所有函数和所有范围中公开

答案 1 :(得分:5)

JavaScript使用函数作用域 - 每个变量只能在同一函数或高于它的范围内看到。

隐式全局变量是在没有首先声明变量的情况下使用变量时发生的变化。在编译语言中,这会导致编译错误,但是javascript默默地将变量声明为全局对象的属性(在浏览器中这是window对象)

$('#timeIn').on('change', function() {
    var numIn; // only available from inside this anonymous handler function
    ... snip ...
    timeIn = $('#timeIn').val(); // this is an implicit global since it has not been declared anywhere
    // an explicit global, for example's sake
    window.someVar = 'foo';
});

使用javascript v1.7,您还可以通过let关键字建立块范围:

let(a = 5, b = 1) {
    // a and b are scoped to this block
    console.log(a+b); // 6
}
console.log(a+b); // error

答案 2 :(得分:2)

JavaScript中只有3个范围。

x = 1;< - x在全球范围内

var,在函数外部使用时,也会创建一个全局:

<script type="text/javascript">var x = 1;</script>&lt; - x在全球范围内

function () { var x = 1; }&lt; - x处于功能范围

for (let i = 0; i < 5; i += 1) {}&lt; - x在块范围内