|
导读网页的本质就是超级文本标记语言,通过结合使用其他的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中文网其它相关文章! 网站建设是一个广义的术语,涵盖了许多不同的技能和学科中所使用的生产和维护的网站。 |
温馨提示:喜欢本站的话,请收藏一下本站!