this

  • 在面试中,js指向也常常被问到,在开发过程中也是一个需要注意的问题,严格模式下的this指向undefined,这里就不讨论。

普通函数

  • 记住一句话哪个对象调用函数,该函数的this就指向该对象。总指向它的调用者。

obj.getName() 无疑会打印出'黄杰',b()可以写成window.b(),调用的对象为window,因此访问的name为全局的变量。

var name = '车神'
var obj = {
name: '黄杰',
getName: function(){
console.log(this.name)
}
} var b = obj.getName obj.getName()// '黄杰'
b() // '车神'
  • 但是下面的代码,可能就会有点疑惑了,为什么打印的是undefined,因为全局使用var声明的变量会成为window的属性,而ES6的let、const声明的变量不再是window的属性,通过window.name不能访问该属性。
let name = '车神'
let obj = {
name: '黄杰',
getName: function(){
console.log(this.name)
}
} let b = obj.getName b() // undefined

箭头函数

  • 箭头函数在定义时就决定了this的指向,定义时所处的上下文环境对象即为this的指向,全局的上下文环境对象为window。

有些人认为不应该是两个都是'黄杰吗'?js中的执行上下文有全局、函数、Eval执行上下文,对象并不是执行上下文,因此它会一直往上寻找最近的执行上下文。即为window。

var name = '车神'
var obj = {
name: '黄杰',
getName: () =>{
console.log(this.name)
}
} var b = obj.getName obj.getName()// '车神'
b() // '车神'

new操作符

1、创建一个空的简单JavaScript对象(即{});

2、链接该对象(即设置该对象的构造函数)到另一个对象 ;

3、将步骤1新创建的对象作为this的上下文 ;

4、如果该函数没有返回对象,则返回this。

面试题一

  • 这是我目前看到最有意思的面试题,先思考两分钟...

var length = 100 function foo(){
console.log(this.length)
} var obj = {
length: 10,
getLength(cb){
cb()// 打印啥?
arguments[0]()// 打印啥?
}
} obj.getLength(foo, length, obj)

1.答案是100、3。

2.cb()调用的对象为window,arguments[0] ()的调用对象为arguments,它是一个伪数组,也是一个对象,length为函数调用时传递参数的长度,因此打印3。

面试题二

  • 这道题也有点意思,还做错了,先思考两分钟
function foo(xx){
this.x = xx
return this
} var x = foo(5) var y = foo(6) console.log(x.x)// 打印啥?
console.log(y.x)// 打印啥?

1.答案是undefined、6,两次调用this都指向window。

2.当执行foo(5)时,得到window.x = window,window.x.x = 5。

3.当执行foo(6)时,this.x = 6相当于window.x = 6,不再是window.x = window,此时window.x并没有x属性,因此通过x.x访问不存在的属性为undefined。

js中函数this的指向的更多相关文章

  1. JS中函数参数和函数返回值的理解

    函数本质就是功能的集合 JS中函数是对象,因此,函数名实际上仅仅是一个指向函数对象的指针,不会与某个函数绑定,所以,JS中没有重载(重载就是通过传递不同类型的参数,使两个相同函数名的函数执行不同的功能 ...

  2. 关于js中函数的调用问题

    js中函数的调用方法 1.直接调用 函数名(参数): 2.通过指向函数的变量去调用 例如: var myval = 函数名: 此刻 myval是指向函数的一个指针: myval(实际参数):此刻调用的 ...

  3. 对JS中函数的理解

    函数本质就是功能的集合 JS中函数是对象,因此,函数名实际上仅仅是一个指向函数对象的指针,不会与某个函数绑定,所以,JS中没有重载(重载就是通过传递不同类型的参数,使两个相同函数名的函数执行不同的功能 ...

  4. js中函数传参的情况

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  5. JS中函数void()

    <a href="javascript:void(0)">hello</a>/* * JS中函数void()的运用大体是这种新式; * void()是运算符 ...

  6. js中函数的参数为函数的情况即回调函数

    js中函数的参数可以是数组对象也可以是函数,当参数为函数时我们叫做回调函数 //定义回调函数function B() { console.log("函数B")setTimeout( ...

  7. JS中函数的 this 各种指向

    this是js的一个关键字,随着函数使用场合不同,this的值会发生变化.但是总有一个原则,那就是this指的是调用函数的那个对象. 情形1:如果一个函数中有this,但是它没有被上一级的对象所调用, ...

  8. js中函数的一些理论知识

      函数的一些理论知识 1. 函数:                执行一个明确的动作并提供一个返回值的独立代码块.同时函数也是javascript中的一级公民(就是函数和其它变量一样). 2.函数的 ...

  9. 从Ecma规范深入理解js中的this的指向

    this是面向对象编程中的一个概念,它一般指向当前方法调用所在的对象,这一点在java.c++这类比较严格的面向对象编程语言里是非常明确的.但是在javascript中,this的定义要灵活许多,如果 ...

随机推荐

  1. Serverless 实战 —— Funcraft + OSS + ROS 进行 CI/CD

    前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute):函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数计算准 ...

  2. [工具] Git版本管理(四)(贡献开源代码、git配置、git免密、gitignore)

    一.开源项目贡献代码 1.fork项目代码 例如,我们想向tornado框架贡献代码,首先搜索tornado. 然后,将tornado的代码fork到我们的仓库中. 2.clone到本地进行开发 克隆 ...

  3. Acunetix 11 配置详解

    Acunetix 扫描配置 Full Scan– 使用Full Scan来发起一个扫描的话,Acunetix会检查所有可能得安全漏洞. High Rish Vulnerabilities–这个扫描选项 ...

  4. 从0开发3D引擎(五):函数式编程及其在引擎中的应用

    目录 上一篇博文 函数式编程的优点与缺点 优点 缺点 为什么使用Reason语言 函数式编程学习资料 引擎中相关的函数式编程知识点 数据 不可变数据 可变数据 函数 纯函数 高阶函数 柯西化 参考资料 ...

  5. JavaScript substring()

    JavaScript substring() 方法 参数 描述 start 必需.一个非负的整数,规定要提取的子串的第一个字符在 stringObject 中的位置. stop 可选.一个非负的整数, ...

  6. 流程控制-物流费用计算(嵌套if)

    题目描述 快递公司规定,如果物品体积超过2.5立方米,不允许快递.如果重量超过40kg,不允许快递.快递收费价格为: 小于等于1kg,一口价10块钱: 大于1kg,小于等于5kg,10块钱的基础上,每 ...

  7. Java和PHP加解密

    PHP代码 <?php //DES加解密工具 class DesEncrypt { var $key; var $iv; function DesEncrypt($key, $iv=0) { $ ...

  8. Scala与Mongodb实践4-----数据库操具体应用

    目的:在实践3中搭建了运算环境,这里学会如何使用该环境进行具体的运算和相关的排序组合等. 由数据库mongodb操作如find,aggregate等可知它们的返回类型是FindObservable.A ...

  9. 数字金字塔 动态规划(优化版) USACO 一维dp压缩版

    1016: 1.5.1 Number Triangles 数字金字塔 时间限制: 1 Sec  内存限制: 128 MB提交: 9  解决: 8[提交] [状态] [讨论版] [命题人:外部导入] 题 ...

  10. crawler碎碎念5 豆瓣爬取操作之登录练习

    import requests import html5lib import re from bs4 import BeautifulSoup s = requests.Session() #这里要提 ...