你不知道的JavaScript(this)

对this的常见误解

  this指向函数本身;

  this指向函数的词法作用域;

this是在运行时进行绑定的,并不是在编写时,它的上下文取决于函数调用时的条件。

this的绑定和函数声明的位置没有任何关系,只取决于函数的调用方式。

function identify() {
  return this.name.toUpperCase();
}
function speak() {
  var greeting = “Hello, I’m” + identify.call(this);
  console.log(greetin);
}

var me = {
  name: “Kyle"
};

var you = {
  name: “Reader"
};

identify.call(me);
identify.call(you);

speak.call(me);
speak.call(you);

对象属性引用链中只有最顶层或者说最后一层会影响调用位置

function foo() {
  console.log(this.a);
}

var obj2 = {
  a: 42,
  foo: foo
};

var obj1 = {
  a: 2,
  obj2: obj2
};

obj1.obj2.foo(); // 42

判断this的顺序:

?函数是否在new中调用(new绑定)?如果是的话this绑定的是新创建的对象

var bar = new foo()

?函数是否通过call、apply(显示绑定)或者硬绑定调用?如果是的话,this绑定的是指定的对象

var bar = foo.call(obj2)

?函数是否在某个上下文对象中调用(隐式绑定)?如果是的话,this绑定的是那个上下文对象

var bar = obj1.foo();

?如果都不是的话,使用默认绑定。严格模式下,绑定到undefined,否则绑定到全局对象。

时间: 2024-12-29 15:12:29

你不知道的JavaScript(this)的相关文章

你不知道的Javascript(上卷)读书笔记之一 ---- 作用域

你不知道的Javascript(上卷)这本书在我看来是一本还不错的书籍,这本书用比较简洁的语言来描述Js的那些"坑",在这里写一些博客记录一下笔记以便消化吸收. 1 编译原理 在此书中,开始便提出:Javascript是一门编译型语言,我一开始以为这是国内翻译的锅,翻译的不够准确,后来我还专门去github看了,作者确实是将Js描述为一门编译型语言(compiled language).然而我认为作者更想表达的是Js也拥有和Java一般的特定的编译过程.而不是传统得认为只是单纯的进行&

你不知道的javascript(上卷卷)笔记

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>你不知道的javascript(上卷)</title> </head> <body> </body> </html>

你不知道的javascript(中卷)笔记

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>你不知道的javascript(中卷)</title> </head> <body> <script type="text/javascript"> /* //封装对象包装 var a = new Boolean(false); if(!a)

JavaScript作用域闭包(你不知道的JavaScript)

JavaScript闭包,是JS开发工程师必须深入了解的知识.3月份自己曾撰写博客<JavaScript闭包>,博客中只是简单阐述了闭包的工作过程和列举了几个示例,并没有去刨根问底,将其弄明白! 现在随着对JavaScript更深入的了解,也刚读完<你不知道的JavaScript(上卷)>这本书,所以乘机整理下,从底层和原理上去刨一下. JavaScript并不具有动态作用域,它只有词法作用域.词法作用域是在写代码或者说定义时确定的,而动态作用域是在运行时确定的.了解闭包前,首先我

JavaScript提升(你不知道的JavaScript)

最近,在读<你不知道的JavaScript(上卷)>这本书,书中详细阐述了JavaScript众多重要但经常被大家忽略的点,在此强烈推荐!!!书中,第4章讲述了"提升",从示例出发讲述了变量和函数提升的过程,纠正了自己以前错误的理解(相信好多人理解都是错误)! 我们习惯将var a = 2;看做一个声明,而实际上JavaScript引擎不这么认为!下面几个示例让你彻底搞懂JavaScript中的变量提升! 示例1: a = 2; var a ; console.log(a)

《你不知道的JavaScript》整理(二)——this

最近在读一本进阶的JavaScript的书<你不知道的JavaScript(上卷)>,这次研究了一下“this”. 当一个函数被调用时,会创建一个活动记录(执行上下文). 这个记录会包含函数在哪里被调用(调用栈).函数的调用方法.传入的参数等信息. this就是记录的其中一个属性,会在函数执行的过程中用到. this既不指向函数自身也不指向函数的作用域. this实际上是在函数被调用时发生的绑定,它指向什么完全取决于函数在哪里被调用. 一.调用位置 调用位置就在当前正在执行的函数的前一个调用中

《你不知道的JavaScript》整理(一)——作用域、提升与闭包

最近在读一本进阶的JavaScript的书<你不知道的JavaScript(上卷)>,里面分析了很多基础性的概念. 可以更全面深入的理解JavaScript深层面的知识点. 一.函数作用域 1)函数作用域 就是作用域在一个“Function”里,属于这个函数的全部变量都可以在整个函数的范围内使用及复用. function foo(a) { var b = 2; function bar() { // ... } var c = 3; } bar(); // 失败 console.log( a,

你不知道的JavaScript之类型

JavaScript是一门简单易用的语言,应用广泛,同时它的语言机制又十分复杂和微妙,即使经验丰富的开发人员也需要用心学习才能真正掌握. <你不知道的JavaScript>中是这样定义类型的: 类型是值的内部特征,它定义了值的行为,以使其区别于其他值. 这样的定义可能略简单了一些,不够已经足够让我们去理解类型的含义. 不得不提的强制类型转换 在JavaScript中,强制类型转换无处不在,在我们的程序中,有意无意地,都经常地利用到强制类型转换.它给我们带来了许多便利,同时也容易造成某一些坑.当

你不知道的JavaScript(1)LHS查询和RHS查询

打算把<你不知道的JavaScript>中的知识点整理下,写点自己的心得,同时也敦促自己看书. 先做个整体的介绍,最后会再给个综合的例子. RHS 查询与简单地查找某个变量的值别无二致,而LHS 查询则是试图找到变量的容器本身,从而可以对其赋值. LHS查询 LHS查询指的是找到变量的容器本身,从而可以对其进行赋值.也就是找到赋值操作的目标. LHS查询的时候会沿着作用域链进行查询,找到的话就会将值赋值给这个变量,如果到达作用域顶端仍然找不到,就会在作用域链顶端创建这个变量. 举个例子 var

你不知道的JavaScript(上中下)全册

书籍简介 JavaScript这门语言简单易用,很容易上手,但其语言机制复杂微妙,即使是经验丰富的JavaScript开发人员,如果没有认真学习的话也无法真正理解.本套书直面当前JavaScript开发人员不求甚解的大趋势,深入理解语言内部的机制,全面介绍了JavaScript中常被人误解和忽视的重要知识点.本书是其下卷,主要介绍了JavaScript入门知识和对ES6及未来发展趋势的展望.     本书既适合JavaScript语言初学者了解其精髓,又适合经验丰富的JavaScript开发人员