为什么这段代码没有运行?

时间:2013-11-21 08:27:43

标签: javascript scope

(function () {
    "use strict";


    function initialize() {
        myList = ['one', 'two', 'three'];
    }

    function displayList() {
        var i, n;
        for (i = 0, n = myList.length; i < n; i += 1) {
            alert(myList[i]);
        }
    }
    initialize();
    displayList();

})();

如果不使用var,myList变量应该被创建为一个全局变量。无论哪种方式,代码都应该运行。代码有什么问题??

3 个答案:

答案 0 :(得分:7)

myList = ['one', 'two', 'three'];

在严格模式下,不允许以这种方式创建全局变量。

来自官方Mozilla documentation -

  

首先,严格模式使得无法意外创建全局   变量。在正常的JavaScript中错误输入赋值中的变量   在全局对象上创建一个新属性并继续“工作”   (虽然未来的失败是可能的:可能,在现代JavaScript中)。   意外创建全局变量的赋值   扔严格模式:

     

“use strict”;

     

misypedVaraible = 17; //抛出ReferenceError

This works -

(function () {
    "use strict";

    var myList;

    function initialize() {
        myList = ['one', 'two', 'three'];
    }

    function displayList() {
        var i, n;
        for (i = 0, n = myList.length; i < n; i += 1) {
            alert(myList[i]);
        }
    }

    initialize();
    displayList();
})();

答案 1 :(得分:0)

在严格模式下,您无法设置类似的全局变量。

你必须要做

(function () {
    "use strict";

    var myList;

    function initialize() {
        myList = ['one', 'two', 'three'];
    }

    function displayList() {
        var i, n;
        for (i = 0, n = myList.length; i < n; i += 1) {
            alert(myList[i]);
        }
    }
    initialize();
    displayList();

})();

答案 2 :(得分:0)

使用"use strict"你将自己限制在严格模式(这是一件好事),但这意味着你不能只使用尚未设置的变量。

如果要将myList定义为全局变量,则必须在函数启动之前执行此操作,因此在脚本顶部放置:var myList;