JavaScript 中 this 的用法
在 JavaScript 中,this
是动态绑定,或称为运行期绑定的。一般而言,在Javascript中,this
指向函数执行时的当前对象。
由于其运行期绑定的特性,JavaScript 中的 this
可以是全局对象、当前对象或者任意对象,这完全取决于函数的调用方式。JavaScript 中函数的调用有以下几种方式:没有明确的调用对象,作为对象方法调用,使用 new
关键字作为构造函数调用,和使用 apply
、 call
和 eval
调用。
没有明确的当前对象时
当没有明确的执行时的当前对象时,this
指向全局对象 window
。
纯粹的函数调用
举个栗子
1 |
var x = 1; |
再看个复杂的栗子
1 |
var name = "window"; var Bob = { |
其实也不复杂,只要按照上面那句话来判断就行。
setTimeout、setInterval和匿名函数
在浏览器中 setTimeout
、setInterval
和匿名函数执行时的当前对象是全局对象 window
,这条可以看成是上一条的一个特殊情况。
1 |
var name = "Bob"; |
setTimeout
可以看做是一个延迟执行的匿名函数。
1 |
waitShowName : function(){ |
由于匿名函数的当前对象是 window
,所以当在该匿名函数中运行回调函数时,回调函数的 this
指向了 window
,所以 alert 出来 window.name
。
作为对象方法调用时
使用这种调用方式时,this
被自然绑定到该对象。
通常情况
1 |
var text = 'window' |
内部函数调用
但是,如果在 obj
的 foo()
内部再声明一个函数,在内部函数中调用 this
,像下面这样:
1 |
'use strict'; |
这是因为 this
指针只在 foo 方法的函数内指向 obj ,在函数内部定义的函数, this
又指向undefined
了!(在非 strict
模式下,它重新指向全局对象 window
!)
修复的办法是用一个 that
变量首先捕获 this
:
1 |
'use strict'; |
三种特殊情况
new关键字 - 作为构造函数调用时
所谓构造函数,就是通过这个函数生成一个新对象。这时,this
就指这个新对象。
1 |
function Person(__name){ |
apply 和 call
在 JavaScript 中函数也是对象,对象则有方法,apply()
和 call()
就是函数对象的方法。它们能够强制改变函数执行时的当前对象,让 this
指向其他对象。
apply()
接收两个参数,第一个参数就是需要绑定的this变量,第二个参数是 Array,表示函数本身的参数。call()
与 apply()
的唯一区别就是把函数本身的参数一个个传入。
1 |
// 对普通函数调用,通常把 this 绑定为 null |
举个使用 apply()
改变当前对象的栗子:
1 |
var name = "window"; var someone = { |
apply()
的参数为空时,默认调用全局对象。
eval
对于 eval
函数,其执行时候似乎没有指定当前对象,但实际上其 this
并非指向 window
,因为该函数执行时的作用域是当前作用域,即等同于在该行将里面的代码填进去。
1 |
var name = "window"; var Bob = { |
参考
JavaScript 中 this 的用法的更多相关文章
- JavaScript中return的用法详解
JavaScript中return的用法详解 最近,跟身边学前端的朋友了解,有很多人对函数中的this的用法和指向问题比较模糊,这里写一篇博客跟大家一起探讨一下this的用法和指向性问题. 1定义 t ...
- JavaScript中this的用法 及 如何改变this的指向
要懂得JavaScript中this的用法,首先需要知道,JavaScript中的作用域相关知识. var fun = function(){ var flag = 1; console.log(fl ...
- javascript中 try catch用法
javascript中 try catch用法 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2015-08-16我要评论 JS try catch语句一般在什么情况下使用?是必须使 ...
- 从函数调用的角度,探讨JavaScript中this的用法
js函数调用方式大概可分为:函数调用,构造器调用,call或apply,方法调用四种方式.下面结合一些基础概念和实测代码,从函数调用的角度,探讨JavaScript中this的用法. 1. new对函 ...
- JavaScript中this的用法详解
JavaScript中this的用法详解 最近,跟身边学前端的朋友了解,有很多人对函数中的this的用法和指向问题比较模糊,这里写一篇博客跟大家一起探讨一下this的用法和指向性问题. 1定义 thi ...
- 在HTML页面中实时获取新消息的方法 “JavaScript中的setInterval用法”
JavaScript中的setInterval用法(资料来源:博主---八神吻你 ) setInterval动作的作用是在播放动画的时,每隔一定时间就调用函数,方法或对象.可以使用本动作更新来自数 ...
- JavaScript中一些怪异用法的理解
引言 JavaScript这门语言有些场合的用法还是比较怪异的.这篇文章会尽量将这门语言特有的一些比较特殊的用法收集在一起.就当是平时开发时需要注意的地方吧. 特殊用法收集 1.!!用法 在JavaS ...
- JavaScript中Cookie的用法
Javascript中Cookie主要存储于客户端的计算机中,用于存放已访问的站点信息,Cookie最大约为4k.以下实例主要用于页面在刷新时保存数据,具体的用法如下所示: <html> ...
- javaScript中with的用法
1 JavaScript中的with语句的作用是为逐级的对象访问提供命名空间式的速写方式, 也就是在指定的代码区域, 直接通过节点名称调用对象 初次接触到with用法,是这样一段代码: 1 2 3 4 ...
- javascript中的继承用法
本文实例汇总了javascript关于继承的用法,希望本文所述对大家的javascript程序设计有所帮助.分享给大家供大家参考.具体如下:代码如下: /** * 实现子类继承父类,但不会产生多余的属 ...
随机推荐
- Python学习(三)流程控制
Python流程控制 本章介绍 python 的基础流程控制.包括 if 条件语句.for 循环 和 while 循环语句: continue 及 break 的用法等. 基本用法与 C 和 Java ...
- Unity3D 浅谈被忽略的Quality [转]
开始分享之前,我先墨迹几句... 最近在工作上,在交流群中,都会遇到一些问题.比如: 为什么打包Android Apk以后,图片变模糊了? 为什么移动端的阴影和电脑端不一样? 我的电脑明明配置很好,为 ...
- EasyUI-window包含一个iframe,在iframe中如何关闭window
我试过类似$('#win').window('close');报$.data...options无效的错误,我已经引入了js文件,路径没问题,而且在同一个页面,不用iframe是可以关闭的 在ifra ...
- (回溯法)数组中和为S的N个数
Given a list of numbers, find the number of tuples of size N that add to S. for example in the list ...
- Python-urllib学习记录
urllib是python自带库,不要专门安装,还挺好用的. 脚本语言的好处之一就是随写随用,有些东西用C语言写真的是能把人累死,换成python就是几行代码,so easy,对于喜欢偷懒的同学绝对是 ...
- ejs和swig对比的问题之一
本来想测试下两者在nodejs中得执行速度,设置了一个测试数据,如下 var testData = { title:'测试标题', description: '<p>这是一个描述,里面用很 ...
- Word该值小于列表中的前一条目
在Word中进行多级编号时,前面一个二级标题是2.1,可后面一个二级标题是4.1,于是想把4.1改成2.2,使用 选中有问题的编号,右击"设置列表缩进",在打开的对话框中我们可以看 ...
- 删除android ScrollView边界阴影方法
XML文件中添加以下方法: android:fadingEdge=”none” 或者,代码中设置为false即可 ScrollView.setHorizontalFadingEdgeEna ...
- Scala数据类型中的Symbol(符号文本)
1.属于基本类型,被映射成scala.Symbol 2.当两个Symbol值相等时,指向同一个实例 3.Symbol类型存在的意义:作为不可变的字符串,同时不必重复地为相同对象创建实例,节省资源.这类 ...
- es5 - array - concat
/** * 描述:数组元素合并 * 使用:arr1.concat(arr2) * 参数:arr1.concat(arr2,arr3,arr...) * 说明: * 该concat方法创建一个新数组,该 ...