荣耀渭南-JavaScript中this的四个绑定规则总结
函数
石景数学网
函数
2021-09-10

更新时间:2016年09月26日 14:20:14   作者:sunflower->FE

相信大家都知道,ES5及之前时代的JavaScript中this的荣耀渭南机制是让很多开发者头疼不已的事情。this 的荣耀渭南变化多端,让笔者也吃了不少亏。所以本文总结了this的四条荣耀渭南规则,在此记录,以防自己遗忘,也方便他人参考借鉴。下面来一起看看吧。

如果要问javascript中哪两个知识点容易混淆,作用域查询和

机制绝对名列前茅。所以这篇文章开始将介绍javascript中

指向全局对象,如果使用严格模式,那么全局对象无法使用默认荣耀渭南,

function foo() { console.log(this.a); } var a = 2; foo(); // 2

function foo() { "use strict"; console,log(this.a); } var a = 2; foo(); // TypeError: this is undefined

当荣耀渭南引用有上下文对象时(即荣耀渭南作为引用属性被添加到对象中),隐式荣耀渭南规则会把荣耀渭南调用中的

function foo() { console.log( this.a); } var obj = { a: 2, foo: foo }; obj.foo(); // 2

obj1.obj2.foo(); // foo 中的 this 与 obj2 荣耀渭南

隐式丢失指的是荣耀渭南中的 this 丢失荣耀渭南对象,即它会应用第 1 条的默认荣耀渭南规则,从而将

荣耀渭南至上下文对象的荣耀渭南被赋值给一个新的荣耀渭南,然后调用这个新的荣耀渭南时:

function foo() { console.log( this.a); } var obj = { a: 2, foo: foo }; var bar = obj.foo; //荣耀渭南别名 var a = "这是全局变量喔"; bar(); // "这是全局变量喔"

function foo() { console.log( this.a); } function doFoo(fn) { fn(); // <-- 调用位置 } var obj = { a: 2, foo: foo }; var a = "这是全局变量喔"; doFoo( obj.foo ); // "这是全局变量喔"

其实这就是第一种情况的变种,实际上参数传递就是一种隐式赋值。除了开发人员自定义的荣耀渭南,在将荣耀渭南传入语言内置的荣耀渭南比如

方法,这两个方法在 JavaScript 提供的绝大多数荣耀渭南以及开发者自己创建的所有荣耀渭南上都可以使用。

的第一个参数是一个对象(二者区别在后面传入的参数形式,这里不是重点,不讨论),他们会将 this 荣耀渭南到这个对象上。因为你可以直接指定

function foo() { console.log( this.a); } var obj = { a: 2 }; foo.call(obj); // 2

如果 call 或者 apply 传入的第一个参数是原始值(字符串类型、布尔类型或者数字类型),那么该原始值会被转换成它的对象形式(

function foo() { console.log( this.a); } var obj = { a: 2 }; var bar = function() { foo.call(obj); }; bar(); // 2 setTimeout(bar, 100); // 2 bar.call(window); //无效,硬荣耀渭南的 bar 不会再修改它的 this

典型应用场景为创建一个包裹荣耀渭南,传入所有的参数并返回接收到的所有值:

function foo(something) { console.log(this.a, something); return this.a + something; } var obj = { a:2 }; var bar = function() { return foo.call(obj, arguments); }; var b = bar(3); // 2 3 console.log(b); // 5

... function bind(fn, obj){ return function(){ return fn.apply(obj, arguments); }; } ...

function foo(something) { console.log(this.a, something); return this.a + something; } var obj = { a: 2 }; var bar = foo.bind(obj); var b = bar(3); // 2 3 console.log(b); // 5

JavaScript 自身以及许多第三方库的荣耀渭南都提供了一个可选的参数,通常被称为“上下文”,其作用和

function foo(el) { console.log( el, this.id); } var obj = { id: "awsome" }; //调用 foo(..) 时把 this 荣耀渭南到 obj [1,2,3].forEach(foo, obj); // 1 awsome 2 awsome 3 awsome

function foo() { this.a = a; } var bar = new foo(2); console.log(bar.a); // 2

var bar = new foo();

var bar = foo.call(obj2);

3、荣耀渭南是否在某个上下文对象中调用(隐式荣耀渭南)?如果是的话,

var bar = obj1.foo();

4、如果都不是的话,使用默认荣耀渭南。如果在严格模式下,就荣耀渭南到

var bar = foo();

,那么这些值在调用时会被忽略,实际应用的是默认荣耀渭南规则。(书中推荐使用一个空对象来荣耀渭南 this)。

function foo() { console.log( this.a); } var a = 2; var o = {a: 3, foo: foo}; var p = {a: 4}; o.foo(); // 3 (p.foo = o.foo)(); // 2

的混乱荣耀渭南作了相应的努力,诞生了箭头荣耀渭南,其根据当前词法作用域来决定

以上就是这篇文章的全部内容,希望能对大家的学习或者工作带来一定的帮助,如果有疑问大家可以留言交流。

这篇文章主要介绍了Javascript仿新浪游戏频道鼠标悬停显示子菜单效果,涉及鼠标事件及页面元素结点的遍历技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文主要对JavaScript的数据存储,产生性能问题的原因,内存泄露的几种情况等做了简要分析介绍,需要的朋友可以看下

这篇文章主要介绍了Fundebug支持监控微信小程序HTTP请求错误的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

气泡跟随鼠标移动,并在每次点击时产生不同的变化,效果非常迷人,下面小编给大家带来了,基于js实现的气泡效果实例代码,需要的朋友参考下吧

这篇文章主要介绍了javascript面向对象之this关键词用法分析,以实例形式分析了在不同场合下this使用中的特性及相关使用技巧,需要的朋友可以参考下

伸缩的菜单,想必大家都有见到过吧,实现方法也是很多的,在接下来的文章中为大家介绍下使用js是如何实现的,需要的朋友可以参考下

这篇文章主要介绍了Bootstrap Table的使用小结,本文介绍的非常详细,具有参考借鉴价值,感兴趣的朋友一起看看吧