摘要:可以意为这时又是一门运行时的语言,所以我们来看看在不同的情况下的含义处于被对象调用的方法中处于普通函数中在构造函数中的指向用简单的话来说就是谁调用,就指向谁先看处于被对象调用的方法中二狗子很明显,调用者是,按照上面的简单规则谁调用就指向谁所
this
this可以意为这时,javascript又是一门运行时的语言,所以我们来看看this在不同的情况下的含义
处于被对象调用的方法中
处于普通函数中
在构造函数中
this的指向用简单的话来说就是
谁调用,就指向谁
先看 处于被对象调用的方法中
var obj = { name: "二狗子", bark: function(){ console.log(this); ==> obj // 很明显,调用者是obj,按照上面的简单规则 “谁调用就指向谁” 所以这里的this == obj console.log("汪汪汪"); } }; obj.bark();
再来 处于普通函数中
var obj = { name: "二狗子", bark: function(){ console.log(this); ===> window // 不要以为bark在obj里面定义的,所以this就是obj,记住javascript是在运行时才能确定的,但是这里等于window,也许会让人有点意外,但是如果你知道了全局环境下所有的属性方法都是于window就不会奇怪了,所以这里其实隐藏了一个window,所以其实是window.bark();这样调用的,在参照 “谁调用就指向谁” 所以这里的this == window console.log("汪汪汪"); } }; // 注意前面没有加obj bark();
接着 在构造函数中
构造函数其实跟普通函数没有任何区别,在没有使用new修饰符的时候,函数就是函数,只有加了new后,函数才是一个构造函数,是new赋予了函数的特殊能力让其进化成了构造函数
func1和func2都是普普通通的函数 function func1(){} function func2(){} new func1(); // 嘭,一瞬间,func1有了新的使命,他成了一个构造函数
那么构造函数有什么用呢? 用处就是,他会返回一个对象
function func1(){ this.name = "一号狗子"; } function func2(){ this.name = "二号狗子"; } var dog = new func1(); // dog1获得了一个对象 var dog = func2(); // dog2什么都没有,因为函数没有返回任何东西 当对函数使用new修饰符时,函数的内部的this的指向则是返回的那个对象,这是js引擎的背后的行为
call apply
call和apply说白了就是改变this指向的两个方法,这两个方法属于function类型,所以只要一个变量的原型链上有function,那么它就有call和apply方法
既然说道改变this指向,怎么改变呢?
我们回到第一个例子,这里的this我们已经知道了是指向obj,能改变吗?能,试试apply
var obj = { name: "二狗子", bark: function(){ console.log(this); ==> obj console.log("汪汪汪"); } }; obj.bark(); // 第一个参数是你需要将this改指 的变量,后面则是需要传给func的参数,这里我们没有给bark传,所以没写 // func.apply(context, arg...) obj.bark.apply(window);
就这么简单,call也是一样的使用方式,只是call和apply处理传入参数的方式有一小点区别,
就是call()方法接受的是一个参数列表,而apply()方法接受的是一个包含多个参数的数组。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/82607.html
摘要:理解文章中已经比较全面的分析了在中的指向问题,用一句话来总结就是的指向一定是在执行时决定的,指向被调用函数的对象。与和直接执行原函数不同的是,返回的是一个新函数。这个新函数包裹了原函数,并且绑定了的指向为传入的。 理解 JavaScript this 文章中已经比较全面的分析了 this 在 JavaScript 中的指向问题,用一句话来总结就是:this 的指向一定是在执行时决定的,...
摘要:也就是说,区别就是,当你希望改变上下文环境之后并非立即执行,而是回调执行的时候,使用方法而则会立即执行函数。 - call、apply:在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向。 JavaScript 的一大特点是,函数存在「定义时上下文」和「运行时上下文」以...
摘要:不能应用下的等方法。首先我们可以通过给目标函数指定作用域来简单实现方法保存,即调用方法的目标函数考虑到函数柯里化的情况,我们可以构建一个更加健壮的这次的方法可以绑定对象,也支持在绑定的时候传参。原因是,在中,多次是无效的。 bind 是返回对应函数,便于稍后调用;apply 、call 则是立即调用 。 apply、call 在 javascript 中,call 和 apply 都是...
摘要:可能上面的例子不是很常见,但是我们经常见到这样的代码你好美女你好美女方法是数组特有的方法,它是定义在构造函数的原型中的方法,所以我们实例化的数组就都继承了这个方法,但是字符串是没有方法,但此处我们就借用了数组的方法来处理字符串。 在学习javascript的时候,对于call()和apply()的用法总是难以理解,相信很多小伙伴和我又一样的想法。现在和小伙伴们分享一下。 call ...
摘要:具体可参考下面代码定义到原型链上的方法这里没有继承父类中的方法张三张三太史公曰总结一下与兄弟俩的任务使用一个指定的值和若干个指定的参数值的前提下调用某个函数或方法。本篇人物小传自此结束。 在JavaScript中,有这么俩货,一个叫call,一个叫apply,它们俩工作几乎一毛一样,但是也有所区别,曾经对这个知识点非常困惑,看过几篇博客也没搞清楚这哥俩到底打算要干个啥,直到某天仔细研究...
阅读 2018·2023-04-25 15:11
阅读 3395·2021-09-23 11:57
阅读 1350·2021-07-26 23:38
阅读 1302·2019-08-30 15:54
阅读 616·2019-08-30 15:53
阅读 3229·2019-08-26 13:36
阅读 957·2019-08-26 12:01
阅读 2834·2019-08-23 16:21