将当前作用域的jQuery / plainJS变量/函数传递给从当前作用域调用的匿名函数

时间:2009-07-23 09:56:52

标签: javascript jquery scope

如何将当前作用域变量和函数传递给普通Javascript或jQuery中的匿名函数(如果它特定于框架)。

例如:

jQuery.extend({
  someFunction: function(onSomeEvent) {
    var variable = 'some text'
    onSomeEvent.apply(this); // how to pass current scope variables/functions to this function?
    return null;

    _someMethod(arg) {
      console.log(arg);
    }
  }
});

应该从上面的函数登录firebug:

jQuery.someFunction(function(){
  console.log(this.variable); // or console.log(variable);
  console.log(this._someMethod(1); // or jQuery.someFunction._someMethod(2);
});

谢谢!

2 个答案:

答案 0 :(得分:3)

阅读JavaScript中的范围,例如“Java Script:The good parts”。

在Java Script中,函数内只有范围。 如果使用 var 在函数内指定变量,则无法从此函数外部访问它们。这是在JavaScript中创建私有变量的方法。

您可以使用变量,指向您所在的当前对象(这不是作用域本身)。但!如果您在没有命令的情况下启动功能,则将指向外部范围(在大多数情况下,它是窗口对象=全局范围)。

示例:

function foo(){
  var a = 10;
}
var f = foo(); //there is nothing in f
var f = new foo(); //there is nothing in f

function bar(){
  this.a = 10;
}
var b = new bar(); //b.a == 10
var b = bar(); //b.a == undefined, but a in global scope

顺便说一下,查看apply方法Mozilla docs/apply的语法 所以你可以看到,拳头参数是对象,当你的方法被调用时,这个

所以请考虑这个例子:

function bar(){ 
  console.log(this.a);
  console.log(this.innerMethod(10)); 
}

function foo(){ 
  this.a = 10;
  this.innerMethod = function(a){
     return a+10;
  }

  bar.apply(this); 
}

var f = new foo(); // => you will get 10 and 20 in the console.
var f = foo(); // => you will still get 10 and 20 in the console. But in this case, your "this" variable //will be just a global object (window)

也许最好制作

var that = this;

在调用apply方法之前,但也许不需要它。不确定

所以,这肯定会奏效:

function foo(){
  console.log(this.a);
}
jQuery.extend({
 somefunc: function(func){
   this.a = 10;
   func.apply(this);
 }
});

$.somefunc(foo); //will print 10.

答案 1 :(得分:0)

在第1行之前:

var that = this;

然后改变第4行:

onSomeEvent.apply(that);