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指向的更多相关文章

  1. 图解javascript this指向什么?

    JavaScript 是一种脚本语言,支持函数式编程.闭包.基于原型的继承等高级功能.JavaScript一开始看起来感觉会很容易入门,但是随着使用的深入,你会发现JavaScript其实很难掌握,有 ...

  2. javascript this指向

    this对象是什么: this对象是与运行时函数执行的上下文绑定的.这句话其实已经很好的解释了this对象,为我们确定this指明了方向!但是需要注意的是:由于javascript具有动态性(解释执行 ...

  3. 一分钟搞懂 JavaScript this 指向问题

    关于Javascript的this指向问题,网络上有很多分析文章,写的很好,比如这里和这里 我这里做一个简单的总结. 箭头函数的 this 箭头函数内的this指向外层函数定义时所在的作用域.如果没有 ...

  4. JavaScript this指向相关内容

    1,默认绑定this指向windw对象 看代码: function test(C){ var a = 123 function b(){}; } 在预编译环节当中. OA{ arguments:[1] ...

  5. 理解javascript this指向

    匿名函数中的this指向window对象 这句话很经典: 每个函数在调用时,其活动对象都会自动获取两个特殊的变量:this和arguments.内部函数在搜索这两个变量时,只会搜到其活动对象为止,因此 ...

  6. JavaScript this指向问题

    this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定,this最终指向调用它的对象. 1.函数调用模式: 当一个函数并非一个对象的属性时,那么它就是被当做函数来调用的.在此种模式下, ...

  7. Javascript定时器(二)——setTimeout与setInterval

    一.解释说明 1.概述 setTimeout:在指定的延迟时间之后调用一个函数或者执行一个代码片段 setInterval:周期性地调用一个函数(function)或者执行一段代码. 2.语法 set ...

  8. JavaScript Tips

    Tips: return false - event.preventDefault(); //阻止默认行为 P.S 阻止a标签的跳转 - event.stopPropagation(); //阻止事件 ...

  9. javascript值和引用

    JavaScript引用指向的是值. 简单值(即标量基本类型值,基本类型值,js中6类,null.undefined.boolean.number.string和symbol)总是通过值复制的方式来赋 ...

  10. 《你不知道的JavaScript》整理(五)——值与原生函数

    一.值 1)数字 JavaScript只有一种数值类型:number(数字),包括"整数"和带小数的十进制数. //数字的语法 a.toExponential(); // &quo ...

随机推荐

  1. Git 本地操作

    版权声明:数学是研究世界的本质,自然科学是研究上帝的意志,而计算机则是揣摩屌丝人类的意志   目录(?)[-] 命令 git config 增删改查 init clone add commit sta ...

  2. 重识 PWA 进阶到 workbox3

    看到PWA,似曾相识,但又感觉很模糊,于是乎,又重新翻阅文档,学习了一遍,顺便把相关知识学习了一下,比如service worker,workbox3. PWA 概念: 全称:Progressive ...

  3. java批量解压文件夹下的所有压缩文件(.rar、.zip、.gz、.tar.gz)

    // java批量解压文件夹下的所有压缩文件(.rar..zip..gz..tar.gz) 新建工具类: package com.mobile.utils; import com.github.jun ...

  4. java极光推送记录

      1. 添加poom依赖: <dependency> <groupId>cn.jpush.api</groupId> <artifactId>jigu ...

  5. 关于Mybatis中Mapper是使用XML还是注解的一些思考

    XML 据说可以灵活的进行注解,但是修改以后还是要重新发布程序.当然,你可以说,在Tomcat中改了,然后热加载了,不就可以了.可是一般情况下都是几台,十几台服务器.都是用发布系统,持续集成的方式部署 ...

  6. 课程一(Neural Networks and Deep Learning)总结——1、Logistic Regression

    ---------------------------------------------------------------------------------------------------- ...

  7. Win7删除网络位置那些不用的网络位置(驱动器)

    1.初始状态: 映射成功的网络位置如下图 2.要删除这个网络位置:点击"打开网络和共享中心",然后如下图设置: 3.重启电脑之后,删除的"网络位置"不会在资源管 ...

  8. (转)Linux PS 详解

    原文:https://cn.aliyun.com/jiaocheng/162702.html 摘要:原文地址:http://www.cnblogs.com/wangkangluo1/archive/2 ...

  9. (转)python类:magic魔术方法

    原文:https://blog.csdn.net/pipisorry/article/details/50708812 版权声明:本文为博主皮皮http://blog.csdn.net/pipisor ...

  10. SpringSecurity学习之基于数据库的用户认证

    SpringSecurity给我们提供了一套最基本的认证方式,可是这种方式远远不能满足大多数系统的需求.不过好在SpringSecurity给我们预留了许多可扩展的接口给我们,我们可以基于这些接口实现 ...