javascript中 this 指向問題

2021-09-11 09:31:20 字數 3704 閱讀 1225

this是執行上下文環境的乙個屬性,而不是某個變數物件的屬性。

在全域性**中,this始終是全域性物件本身,這樣就有可能間接的引用到它了。

在通常的函式呼叫中,this是由啟用上下文**的呼叫者來提供的,即呼叫函式的父上下文(parent context )。this取決於呼叫函式的方式。

如果通過bind的方式得到的函式,那麼該函式中的this指向bind的第乙個引數;

如果通過某個物件使用句點符號觸發函式,那麼函式中的this指向該物件;

如果直接觸發函式,那麼函式中的this指向全域性物件(在瀏覽器中指向window,在node.js中指向global);

function

cat(name) `);

console.log(`this euqal window: $`);

}}var mi = new cat('mi');

mi.test(); // "this equal _this: true"

// "this euqal window: false"

var test1 = mi.test;

test1();// "this equal _this: false"

// "this euqal window: true"

複製**

var obj2 = {};

function

thisfunc2() `);

console.log(`this2 equal obj2: $`);

};var thisfunc22 = thisfunc2.bind(obj2);

thisfunc2();// "this2 equal window: true"

// "this2 equal obj2: false"

thisfunc22();// "this2 equal window: false"

// "this2 equal obj2: true"

複製**

var globalname = 'globalname';

var obj3 = 'sofia';

function

thisfunc3(a) `);

console.log(`a: $`);

}var thisfun33 = thisfunc3.bind(obj3, 4);

thisfun33.call(globalname, 3);// "this3'name: sofia"

// "a: 4"

thisfun33();// "this3'name: sofia"

// "a: 4"

複製**

var obj4 = `);

}};obj4.thisfunc4(); // "this4 equal obj4: true"

複製**

var obj5 = {};

function

thisfunc5 () `);

}obj5.thisfunc5 = thisfunc5;

obj5.thisfunc5(); // "this5 equal obj5: true"

複製**

var obj6 = {};

obj6.thisfunc6 = function () `);

}obj6.thisfunc6(); // "this6 equal obj6: true"

複製**

var obj7 = {}, obj77 = {};

obj7.thisfunc7 = function () `);

console.log(`this7 equal obj77: $`);

}var thisfunc77 = obj7.thisfunc7.bind(obj77)

thisfunc77();

// "this7 equal obj7: false"

// "this7 equal obj77: true"

複製**

function

thisfunc1() `);

};thisfunc1(); // "this1 equal window: true"

複製**

或者換種寫法:

var obj8 = `);

console.log(`this8 equal window: $`);

}}obj8.thisfunc9 = thisfunc77;

obj8.thisfunc9();

// "this7 equal obj7: false"

// "this7 equal obj77: true"

var thisfunc88 = obj8.thisfunc8;

thisfunc88();

// "this8 equal obj8: false"

// "this8 equal window: true"

複製**

function

logname()

function

dofun1(fn)

function

dofun2(o)

var obj = ;

var name = "hanmeimei";

dofun1(obj.logname);

dofun2(obj);

複製**

結果

hanmeimei

--------------------------------------------

lilei

複製**

function

fun(somthing) , somthing: $`);

};function

bindfun(fn, obj)

}var obj = ;

var bar = bindfun(fun, obj);

console.log(bar);

var b = bar('sofia');

複製**

結果

function () 

--------------------------------------------

name: lilei, somthing: sofia

複製**

function

logname()

var name = "xiaoming";

var lilei = ;

var hanmeimei = ;

(hanmeimei.logname = lilei.logname)();

複製**

結果

window

--------------------------------------------

xiaoming

複製**

JavaScript中prototype的理解

prototype使我們能夠向物件新增屬性或者方法。語法 object.prototype.name value 2.基於原型的繼承 obj2 和obj3都是函式foo的例項,可以看到每個例項不僅有自己自身的屬性,還具有原型鏈上的x 也就是foo.prototype 3.prototype與原型 通...

javascript中處理時間

var mydate new date mydate.getyear 獲取當前年份 2007 mydate.getfullyear 獲取完整的年份 2007 mydate.getmonth 獲取當前月份 0 11,0代表1月 11 mydate.getdate 獲取當前日 1 31 20 mydat...

javascript中處理時間

var mydate new date mydate.getyear 獲取當前年份 2007 mydate.getfullyear 獲取完整的年份 2007 mydate.getmonth 獲取當前月份 0 11,0代表1月 11 mydate.getdate 獲取當前日 1 31 20 mydat...