代码之家  ›  专栏  ›  技术社区  ›  David Hellsing

获取函数调用方作用域

  •  2
  • David Hellsing  · 技术社区  · 16 年前

    是否可以提取函数调用方作用域?

    我有一个例子:

    var myObject = {
        id: 1,
        printId: function() {
            var myId = function() {
                return this.id;
            }
            console.log(myId());
        }
    }
    
    myObject.printId(); // prints 'undefined'
    

    上面的例子打印出来 undefined ,因为在新函数(在本例中是MyID)中,默认情况下“this”似乎是窗口范围。在执行之前,我是否可以使用应用正确作用域的代理?

    像这样的(虚构的):

    var execute = function( fn ) {
        fn.apply(fn.caller.scope);
    }
    
    var myObject = {
        id: 1,
        printId: function() {
            var myId = function() {
                return this.id;
            }
            execute( myId );
        }
    }
    
    6 回复  |  直到 13 年前
        1
  •  3
  •   shuckster    16 年前

    如果您使用 Prototype library 您可以这样使用函数bind():

    var myObject = {
        id: 1,
        printId: function() {
            var myId = function() {
                return this.id;
            }.bind(this);
            console.log(myId());
        }
    }
    

    可能有点过分杀伤力,但如果您广泛使用这样的对象,可能值得一看。

        2
  •  3
  •   Marius    16 年前

    尝试以下操作:

    var myObject = {
        id: 1,
        printId: function() {
            var myId = function() {
                return this.id;
            }
            console.log(myId.apply(this));
        }
    }
    
    myObject.printId(); // prints '1'
    

    问题是您想要运行函数 myId 在…的范围内 printId ,而不是 米德 . 您可以创建函数,以便通过将其放入 myObject 而不是把它放进去 普林蒂德 :

    var myObject = {
        id: 1,
        printId: function() {
            this.myId = function() {
                return this.id;
            }
            console.log(this.myId());
        }
    }
    
    myObject.printId(); // prints '1'
    

    对评论的回答:

    var 将变量存储在函数范围中,这意味着 米德 存放在里面 普林蒂德 . 这意味着 this 在里面 我的身份证 普林蒂德 而不是 我的对象 . 自从 普林蒂德 存储在 我的对象 , 在里面 打印ID 我的对象 如此 myId.apply(this) 里面 普林蒂德 更改的包含范围 米德 打印ID 我的对象 因此 在里面 米德 现在指 我的对象 . 在第二个例子中 米德 存储在 我的对象 马上,等等 在里面 普林蒂德 米德 指同一对象,即 我的对象 . 这有什么意义吗?P

        3
  •  2
  •   Lodder    13 年前

    Function.bind() 现在浏览器非常支持,如 ECMAScript5 . (更新原型以符合ES5规范)

    对于那些仍然找到这个职位的人。

        4
  •  1
  •   cletus    16 年前

    怎么了:

    var myObject = {
      id: 1,
      printId: function() {
        return this.id;
      }
    }
    

    ?

    如果不是这样,那么:

    var myObject = {
      id: 1,
      printId: function() {
        var myid = function() {
          return this.id;
        };
        return myid.apply(this);
      }
    }
    

    apply() .

        5
  •  1
  •   erikkallen    16 年前
    var myObject = {
        id: 1,
        printId: function() {
            var _this = this;
            var myId = function() { 
                return _this.id;
            }
            console.log(myId());
        }
    }
    
        6
  •  0
  •   lgol27    14 年前
    var myObj = (function()
    {
      var id = 1;
      return {
        printId: function(){
         console.log(id);
    
    };
    })();
    
    
    myObj.printId();
    
    推荐文章