|
導讀網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立... 網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立在超文本基礎之上的。超級文本標記語言之所以稱為超文本標記語言,是因為文本中包含了所謂“超級鏈接”點。 本篇文章給大家帶來的內容是關于ECMA Javascript中this的深入理解(附示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。this 實際上是在函數被調用時發生的綁定,它指向什么完全取決于函數的調用位置(也就是函數的調用方法)。 四條規則:(你不知道的JS) 1. 默認綁定 function foo() {
console.log( this.a );
}
var a = 2;
foo(); // 2無論是否在嚴格模式下,在全局執行上下文中(在任何函數體外部)this 都指代全局對象。(MDN) function foo() {
"use strict";
console.log( this.a );
}
var a = 2;
foo(); // TypeError: this is undefined2. 隱式綁定/丟失當函數作為對象里的方法被調用時,它們的 this 是調用該函數的對象,且綁定只受最靠近的成員引用的影響。(MDN) //隱式綁定
function foo() {
console.log( this.a );
}
var obj2 = {
a: 42,
foo: foo
};
var obj1 = {
a: 2,
obj2: obj2
};
obj1.obj2.foo(); // 42//隱式丟失
function foo() {
console.log( this.a );
}
function doFoo(fn) {
// fn 其實引用的是 foo
fn(); // <-- 調用位置!
}
var obj = {
a: 2,
foo: foo
};
var a = "oops, global"; // a 是全局對象的屬性
doFoo( obj.foo ); // "oops, global"3. 顯示綁定如果要想把 this 的值從一個上下文傳到另一個,就要用 call 或者apply 方法。(MDN) var obj = {
count: 0,
cool: function coolFn() {
if (this.count < 1) {
setTimeout( function timer(){
this.count++; // this 是安全的
// 因為 bind(..)
console.log( "more awesome" );
}.bind( this ), 100 ); // look, bind()!
}
}
};
obj.cool(); // 更酷了。硬綁定創建一個包裹函數,傳入所有的參數并返回接收到的所有值。 // 簡單的輔助綁定函數
function bind(fn, obj) {
return function() {
return fn.apply( obj, arguments );
};
}軟綁定給默認綁定指定一個全局對象和 undefined 以外的值,那就可以實現和硬綁定相同的效果,同時保留隱式綁定或者顯式綁定修改 this 的能力。 Function.prototype.softBind = function(obj) {
var fn = this;
var curried = [].slice.call( arguments, 1 );// 捕獲所有 curried 參數
var bound = function() {
return fn.apply(
(!this || this === (window || global))?obj : this
curried.concat.apply( curried, arguments )
);
};
bound.prototype = Object.create( fn.prototype );
return bound;
};4. new 綁定當一個函數用作構造函數時(使用new關鍵字),它的this被綁定到正在構造的新對象。(MDN)
function foo(a) {
this.a = a;
}
var bar = new foo(2);
console.log( bar.a ); // 2四條規則優先級 new 綁定 > 顯式綁定 > 隱式綁定 > 默認綁定
例外 1. 箭頭函數 箭頭函數不使用 this 的四種標準規則,而是根據外層(函數或者全局)作用域來決定 this 。 2. nodejs setTimeout(function() {
console.log(this)
//瀏覽器中:window
//nodejs中:Timeout實例
}, 0)其他解釋 https://www.zhihu.com/questio... obj.child.method(p1, p2) 等價于 如果你傳的 context 就 null 或者 undefined,那么 window 對象就是默認的 context(嚴格模式下默認 context 是 undefined) 例子 var number = 50;
var obj = {
number: 60,
getNum: function () {
var number = 70;
return this.number;
}
};
alert(obj.getNum());
alert(obj.getNum.call());
alert(obj.getNum.call({number:20}));以上就是ECMA Javascript中this的深入理解(附示例)的詳細內容,更多請關注php中文網其它相關文章! 網站建設是一個廣義的術語,涵蓋了許多不同的技能和學科中所使用的生產和維護的網站。 |
溫馨提示:喜歡本站的話,請收藏一下本站!