2

我想通过 set 函数设置一个全局变量,但它总是将其设置为undefined值:

var name;
var setName = function(name){
    this.name = name;
}
4

3 回答 3

3

在这种情况下,您不使用this. (它可以工作,但不一定。为什么?读这个

只需使用:

var name;
var setName = function (aname) {
    name = aname;
}

还要确保此代码不在另一个范围(函数)内:

function foo() {
    // ...
    var name;
    var setName = function (aname) {
        name = aname;
    }
    // ...
}

在这种情况下,名称将不是全局的,您必须省略其声明以使其成为全局:

function foo() {
    // ...
    var setName = function (aname) {
        name = aname; // not it is global, if not defined in the visible scope
    }
    // ...
}

但这是一个不好的做法,所以尽量避免污染全局命名空间如果出现以下情况,则在全局命名空间中考虑变量:

  • 它没有var( name = ...,并且没有其他可见的局部变量称为name
  • 它设置在window(例如window.name = ...
于 2013-05-18T15:30:07.457 回答
1
function(val){

    name = val

.....................

于 2013-05-18T15:29:40.940 回答
1

首先,window.name 是一个保留属性,您不应该使用它。

其次,为任何全局 JavaScript 命名空间是个好主意,以避免这些类型的问题或与第三方库的冲突。

这是一个工作示例:

window.MyNamespace = {};
MyNamespace.name = '';
MyNamespace.setName = function(value) {
    MyNamespace.name = value;
};
MyNamespace.setName('hello');
MyNamespace.name; // "hello"

根据您对此在模块中的评论,此代码将起作用:

(function(){ 
    app = {};  
    app.myPerson = (function(){ 
        var name;
        var setName = function(value) {
            name = value;
        };      
        setName('Charlie');
        console.log(name); // Charlie
    })();        
})(); 
于 2013-05-18T15:36:57.807 回答