javascript:this指向
this常见指向问题
this的用法
1.直接在函数中使用 谁调用这个函数this就指向谁
2.对象中使用, 一般情况下指向该对象
3.在构造函数中使用
改变this的指向,两种方法的作用都是相同的,传递的写法不同而已。
call -- (指向谁,参数1,参数2......)
apply -- (指向谁,[参数1,参数2]) 数组的形式
1. this与普通函数执行
- 当一个函数执行不带任何修饰时,使用默认绑定规则。
- 默认绑定:函数体如果在非严格模式下,this绑定到window,严格模式下绑定到undefined。
// 1.1 函数体在非严格模式下的全局函数执行
function fn () {
console.log(this)
}
fn1() // => window
// 1.2 函数体在严格模式下的全局函数执行
'use strict'
function fn () {
console.log(this)
}
fn() // => undefined
// 1.3 函数体在非严格模式下的函数中的函数执行
function fn1 () {
function fn2 () {
console.log(this)
} fn2()
}
fn1() // => window
// 1.4 函数体在严格模式下的函数中的函数执行
'use strict'
function fn1 () {
function fn2 () {
console.log(this)
} fn2()
}
fn1() // => undefined
// 1.5 函数体在非严格模式下,而函数调用在严格模式下时, this依然指向window
function fn () {
console.log(this)
}
(function () {
'use strict'
fn() // => window
})()
2. this与对象中的方法执行
2.1 无论是否是严格模式,当函数引用有上下文对象时,隐式绑定规则会把函数调用中的this绑定到这个上下文对象。
// 2.1.1 函数直接在对象中声明
var obj = {
a: 1,
test: function () {
console.log(this.a)
}
} obj.test(); // => 1
// 2.1.2 函数先声明,再由对象引用
function test () {
console.log(this.a)
}
var obj = {
a: 1,
test: test
} obj.test(); // => 1
2.2 对象属性引用链中只有最顶层或者说只有最后一层会影响调用位置
// 2.2.1 多层对象引用,this指向离函数调用最近的对象
function test () {
console.log(this.a)
}
var obj2 = {
a: 2,
test: test
}
var obj1 = {
a: 1,
obj2: obj2
}
obj1.obj2.test() // => 2
2.3 隐式丢失:被隐式绑定的函数可能会丢失绑定对象。
// 2.3.1 将obj.foo当作函数别名赋值给一个变量
function foo () {
console.log(this.a)
}
var obj = {
a: 2,
foo: foo
}
var bar = obj.foo // 函数别名
var a = '全局属性'
bar() // => 全局属性
在2.3.1中,虽然bar是obj.foo的一个引用,但是实际上,它引用的是foo函数本身,因此此时的bar() 其实是一个不带任何修饰的普通函数调用。因此也使用默认绑定规则。
// 2.3.2 将obj.foo当作bar的回调函数。
function foo () {
console.log(this.a)
}
function bar (fn) {
fn()
}
var obj = {
a: 2,
foo: foo
}
var a = '全局属性'
bar(obj.foo) // => 全局属性
3.this与call,apply
显示绑定规则:this指向第一个参数。
3.1 call
// 3.1.1
var xw = {
name : "小王",
gender : "男",
age : 24,
say : function(school,grade) {
console.log(this.name + " , " + this.gender + " ,今年" + this.age + " ,在" + school + "上" + grade);
}
}
var xh = {
name : "小红",
gender : "女",
age : 12
} xw.say.call(xh, "实验小学", "六年级") // => 小红 , 女 ,今年12 ,在实验小学上六年级
在3.1.1代码示例中,当调用say时强制把它的this绑定到了xh上。
3.2 apply
// 3.2.1
var xw = {
name : "小王",
gender : "男",
age : 24,
say : function(school,grade) {
console.log(this.name + " , " + this.gender + " ,今年" + this.age + " ,在" + school + "上" + grade);
}
}
var xh = {
name : "小红",
gender : "女",
age : 12
} xw.say.apply(xh,["实验小学","六年级"]) // => 小红 , 女 ,今年12 ,在实验小学上六年级
javascript:this指向的更多相关文章
- 图解javascript this指向什么?
JavaScript 是一种脚本语言,支持函数式编程.闭包.基于原型的继承等高级功能.JavaScript一开始看起来感觉会很容易入门,但是随着使用的深入,你会发现JavaScript其实很难掌握,有 ...
- javascript this指向
this对象是什么: this对象是与运行时函数执行的上下文绑定的.这句话其实已经很好的解释了this对象,为我们确定this指明了方向!但是需要注意的是:由于javascript具有动态性(解释执行 ...
- 一分钟搞懂 JavaScript this 指向问题
关于Javascript的this指向问题,网络上有很多分析文章,写的很好,比如这里和这里 我这里做一个简单的总结. 箭头函数的 this 箭头函数内的this指向外层函数定义时所在的作用域.如果没有 ...
- JavaScript this指向相关内容
1,默认绑定this指向windw对象 看代码: function test(C){ var a = 123 function b(){}; } 在预编译环节当中. OA{ arguments:[1] ...
- 理解javascript this指向
匿名函数中的this指向window对象 这句话很经典: 每个函数在调用时,其活动对象都会自动获取两个特殊的变量:this和arguments.内部函数在搜索这两个变量时,只会搜到其活动对象为止,因此 ...
- JavaScript this指向问题
this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定,this最终指向调用它的对象. 1.函数调用模式: 当一个函数并非一个对象的属性时,那么它就是被当做函数来调用的.在此种模式下, ...
- Javascript定时器(二)——setTimeout与setInterval
一.解释说明 1.概述 setTimeout:在指定的延迟时间之后调用一个函数或者执行一个代码片段 setInterval:周期性地调用一个函数(function)或者执行一段代码. 2.语法 set ...
- JavaScript Tips
Tips: return false - event.preventDefault(); //阻止默认行为 P.S 阻止a标签的跳转 - event.stopPropagation(); //阻止事件 ...
- javascript值和引用
JavaScript引用指向的是值. 简单值(即标量基本类型值,基本类型值,js中6类,null.undefined.boolean.number.string和symbol)总是通过值复制的方式来赋 ...
- 《你不知道的JavaScript》整理(五)——值与原生函数
一.值 1)数字 JavaScript只有一种数值类型:number(数字),包括"整数"和带小数的十进制数. //数字的语法 a.toExponential(); // &quo ...
随机推荐
- lucene使用与优化
lucene使用与优化 1 lucene简介 1.1 什么是lucene Lucene是一个全文搜索框架,而不是应用产品.因此它并不像www.baidu.com 或者google Desktop那么拿 ...
- C#连接Access2013
今天测试连接Access2013数据库,遇到错误,综合几个大神建议,解决了 我的系统是windows 2008 64位的,连接字符串如下: <connectionStrings> < ...
- java里面main函数为什么要用static修饰
这学期刚开java,因为之前只写过C++和Python没接触过java,有些写法挺不习惯的,今天写完一个程序,run的时候发现提示the selection can't be launched.... ...
- C++(初学讲解):判断倍数
问题描述输入一个整数,如果是5的倍数,那么输出倍数的值,否则输出NO. 输入描述一个整数. 输出描述输出倍数的值或者NO. 输入示例15 输出示例3 #include <iostream> ...
- To B运营和To C运营到底有什么区别?
无论To B还是To C运营其本质都是从目标用户转化为付费用户实现产品的变现,但是两者之间仍然存在一定的区别. 单纯从概念上来说,To B和To C的区别主要是从电商兴起的,并随着互联网的快速发展,T ...
- hadoop2.7的目录结构
1.$HADOOP_HOME/bin目录下文件及作用 文件名称 说明 hadoop 用于执行hadoop脚本命令,被hadoop-daemon.sh调用执行,也可以单独执行,一切命令的核心 2.$HA ...
- JSPatch动态更新APP
JSPatch,只需在项目中引入极小的引擎,就可以使用JavaScript调用任何Objective-C的原生接口,获得脚本语言的能力:动态更新APP,替换项目原生代码修复bug. 用途 是否有过这样 ...
- 全网最详细的启动或格式化zkfc时出现java.net.NoRouteToHostException: No route to host ... Will not attempt to authenticate using SASL (unknown error)错误的解决办法(图文详解)
不多说,直接上干货! 全网最详细的启动zkfc进程时,出现INFO zookeeper.ClientCnxn: Opening socket connection to server***/192.1 ...
- 计数排序/Counting Sort
计数排序的算法思想: 对于每一个元素x,只要确定了元素x有多少个比它小的元素,那么就可以知道其最终的位置. 记输入数组为A[n],存放最后排序输出的数组为B[n],提供临时存储空间的中间数组记为C[k ...
- redis开机自动服务脚本
1.设置redis.conf中daemonize为yes,确保守护进程开启. 2.编写开机自启动脚本 基本原理为: 系统开机启动时会去加载/etc/init.d/下面的脚本,通常而言每个脚本文件会自定 ...