深入学习Javascript中的this关键字
来源:才华咖 本文已影响2.08W人
来源:才华咖 本文已影响2.08W人
下面的文章将为大家讲述Javascript中的this关键字、讲解了方法调用模式、函数调用模式、构造器调用模式、apply调用模式中this的不同之处,需要的朋友可以参考一下。
理解this
this是一个与执行上下文(execution context,也就是作用域)相关的特殊对象。因此,它可以叫作上下文对象(也就是用来指明执行上下文是在哪个上下 文中被触发的对象)。
任何对象都可以做为上下文中的this的值。在一些对ECMAScript执行上下文和部分this的描述中的 所产生误解。this经常被错误的描述成是变量对象的一个属性。 再重复一次:
this是执行上下文的一个属性,而不是变量对象的一个属性。 这个特性非常重要,因为与变量相反,this从不会参与到标识符解析过程。换句话说,在代码中当访问this的时候,它的值是直接从执行上下文中获取的,并不需要任何作用域链查找。this的值只在进入上下文的时候进行一次确定。
代码如下:
hasOwnProperty:是用来判断一个对象是否有你给出名称的属性或对象。不过需要注意的是,此方法无法检查该对象的原型链中是否具有该属性,该属性必须是对象本身的一个成员。
不知道看官们心里的答案是什么,正确的.答案是true,false。
代码如下:
要弄明白为什么是这样,就必须要理解上面this所扮演的角色,所指代的对象。在《javascript语言精粹》一书中,指出了在javascript中一共有四种调用模式:
1.方法调用模式
2.函数调用模式
3.构造器调用模式
y调用模式
而在这些模式当中,对于如何初始化关键参数this上是存在不同差异的。
方法调用模式
当一个函数被保存为对象的一个属性时,我们称它为一个方法。当一个方法被调用时,this被绑定到该对象。注意加粗的这句是重点:
代码如下:
// 创建myObject。它有一个value属性和一个increment方法
这里,方法increment可以使用this去访问myObject对象,所以可以改变value的值。而且,this到对象的绑定发生在调用的时候。
函数调用模式
如果一个函数并非一个对象的属性时,那么它被当作一个函数来调用,此时,this被绑定到全局对象,书上说这是js语言设计的一个缺陷。倘若设计正确,当内部函数被调用的时,this应该仍然绑定到外部函数的this变量。抛开对语言设计的正确与否讨论,要当函数调用模式时this变量依旧绑定到该对象,有如下经典解决方案:
代码如下:
即是给该方法定义一个变量并且把它赋值为this,那么内部函数就可以通过那个变量访问到this,按照约定,给那个变量命名为that。
构造器调用模式
构造器调用模式即是我一开头给出的例子所提到的。如果在一个函数前面带上new来调用,那么将创建一个连接到该函数的prototype成员新对象,同时this将会被绑定到那个新对象上。听上去十分拗口且难以理解,先再看个demo:
简单来说,Quo对象下的this在被用为构造一个新实例即new时,this指代的是新生成的myQuo对象而不是Quo对象本身。
一句话,重点就是:原型中的this不是指的原型对象,而是调用对象。
再回过头看一开始的demo,就很好理解了,在执行()时,this指代了myTest对象,所以生成了一个foo属性值为“banana”,所以wnProperty("foo")返回值为true。
Apply调用模式
因为javascript是一门函数式面向对象编程语言,所以函数可以拥有方法。apply方法让我们构建一个参数数组并用其去调用其他函数,apply方法接收两个参数,第一个是将被绑定的this的值,第二个是参数数组。说简单直接一点就是apply方法能劫持另外一个对象的方法,继承另外一个对象的属性. 推荐可以看js中apply方法的使用详细解析 ,就不摆demo了。
javascript中String对象的slice()方法
Javascript的this用法简述
如何在Javascript中为String对象添加trim,ltrim,rtrim方法
javascript中setInterval的用法总结
javascript中toString()的用法
关于JavaScript substring()的使用方法
JavaScript中this的用法步骤
浅谈javascript深入理解js闭包
使用JavaScript实现Java的List功能
JavaScript中创建字典对象(dictionary)的实例
理解javascript中的with关键字是什么意思
关于JavaScript中继承的深入理解
如何灵活的理解JavaScript中的this指向
javascript中js闭包的深入理解
JavaScript中push(),join() 函数实例详解
分析JavaScript类型系统之Math
资深HR告诉你面试的关键
关于JavaScript中的类Class详细介绍
Javascript拓展String方法代码
关于JavaScript中isPrototypeOf函数作用和使用实例
深入理解Javascript的继承和原型链
JavaScript instanceof 的使用方法有哪些
javascript作用域和闭包的深入理解
关于异步JavaScript编程中的Promise使用方法
如何入门学习JavaScript
高中生物的关键学习方法
有关JavaScript中的prototype.bind()方法介绍
学好高中历史的七个关键
javascript中sort()的用法分析
JavaScript JS入门详细教程
深入理解Javascript中自执行匿名函数
Javascript中arguments对象的详解和使用方法
关于Javascript 入门基础学习
Javascript实例教程如何使用HoTMetal
JavaScript在Android的WebView中parseInt函数转换不正确
详解JavaScript中的splice()使用方法
浅析javascript中function 的length属性
关于深入理解JavaScript中的对象的介绍
浅谈如何深入学习Javascript中的this关键字
JavaScript ES6中CLASS的使用指南