4

私はこの記事http://dev.opera.com/articles/view/objects-in-javascript/ を読んでいましたが、「'this'キーワードは、メソッドが定義されているオブジェクトを常に参照しているわけではありませんが、代わりに、特定のコンテキストに基づいて変更できます。」'this'がメソッド上のオブジェクトを参照していない例が定義されていません...可能であれば例を挙げてください

4

6 に答える 6

3

現実的に遭遇し、この結果を期待しない可能性がある一例:

var obj = {
    testFunc : function(){
        alert("testFunc: " + this);
    }
}

obj.testFunc();  // this is the object

setTimeout(obj.testFunc, 1000);  // this is window

http://jsfiddle.net/t7ycd/

于 2012-10-10T21:15:49.437 に答える
2

コンテキストを変更するには多くの方法があります。jsfiddle

バインドの使用: (古い IE ブラウザー (IE < 9) ではサポートされていません)

    var obj = {}; 
    function fun1(){};
    obj2 = {};
    obj2.fun1 =  fun1.bind(obj);
    obj2.fun1(); // context inside fun1 would be obj.

apply または call を使用します。

var obj = {}; 
        function fun1(){};
        obj2 = {};
        obj2.fun1 =  function(){
            fun1.apply(obj, arguments);
            //or fun1.call(obj, ar1, arg2,...);
          };
        obj2.fun1(); // context inside fun1 would be obj. 
于 2012-10-10T21:12:19.523 に答える
1

ここに1つの方法があります

var a = {};
a.foo = function(){ console.log(this); }
a.foo(); // object a
a.foo.call(window); // window object
于 2012-10-10T21:13:19.530 に答える
0

Mozilla のドキュメントから直接引用した例を次に示します。

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/this

var o = {prop: 37};

function independent() {
  return this.prop;
}

o.f = independent;

console.log(o.f()); // logs 37

したがって、関数independentはグローバル コンテキストで定義されますが、オブジェクトにアタッチされます。そのオブジェクトで呼び出されると、コンテキストは、関数が定義されているオブジェクトではなく、関数が呼び出されるオブジェクトになります。

callJavaScriptとbindメソッド、および無名関数を使用して、同様の結果を得ることができます。

于 2012-10-10T21:13:10.193 に答える
0

このような

var MyObject = function()
{
 this.initialize();
}

MyObject.prototype.SomeMethod = function()
{
 //common fix is to use
 //var self = this;
 (function(){
    //this has lost scope
    //self will retain the this scope that was desired
 })();
}   
于 2012-10-10T21:13:56.503 に答える
0

クラス A からクラス B のメソッドを呼び出す場合、「this」は、メソッドが含まれているクラスではなく、メソッドを呼び出しているクラス A を参照します。

于 2012-10-10T21:12:06.447 に答える