3

谁能解释为什么第一件事有效而第二件事无效?

function MyObj(val) {
    this.value = val;

    this.myFunc = function(selector) {
        $(selector).html("test: " + this.value);
    }
}

foo = new MyObj("tester");
foo.myFunc("#one"); //This works

func = foo.myFunc;
func("#two"); //This doesnt

如何?我怎样才能让它工作?

JSFIDDLE

4

2 回答 2

4

JavaScript 中的函数this不是固定的。你打电话时

something.somefunc()
// or something['somefunc']()

this绑定到something。当您调用没有对象的函数时,this会绑定到undefined(在严格模式下)或全局对象。

您可以通过保持变量保持正确来解决它this

function MyObj(val) {
    var obj = this;

    this.value = val;

    this.myFunc = function(selector) {
        $(selector).html("test: " + obj.value);
    };
}

ECMAScript 5 提供了一种Function.prototype专门处理这个问题的方法(你通常也应该myFunc使用MyObj.prototype):

var func = foo.myFunc.bind(foo);
func("#two"); // Works now
于 2013-09-08T19:58:20.347 回答
0

用于bind()将 的值分配给this函数:

function MyObj(val) {
    this.value = val;

    this.myFunc = function(selector) {
        console.log(this); // <--- look your console output
        $(selector).html("test: "+this.value);
    }
}

foo = new MyObj("tester");
foo.myFunc("#one");

func = foo.myFunc;
func.bind(foo)("#two"); //  <---- here

或者:

func = foo.myFunc.bind(foo);
func("#two");

演示:http: //jsfiddle.net/M8Qym/1/

于 2013-09-08T20:03:11.210 回答