this 绑定例外之间接引用

在《你不知道的JavaScript》之“this全面解析”一节中,讲到了this绑定例外的间接引用,代码如下:

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

var a = 2;

var o = {
  a: 3,
  foo: foo
}

var p = {
  a: 4
}

o.foo(); // 3
(p.foo = o.foo)(); // 2

注意看最后一行,一开始很难理解,为什么打印出来的是2。

书上的解释如下:

赋值表达式 p.foo = o.foo 的返回值是目标函数的引用, 因此调用位置是 foo() 而不是p.foo() 或者 o.foo()。 根据我们之前说过的, 这里会应用默认绑定。 

估计我语文不是很好,所以读了好几遍才明白。

还是用代码来解释上面这段话的意思吧:

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

var o = {
  a: 3,
  foo: foo
}

var p = {
  a: 4
}

var = 2;

var bar = (p.foo = o.foo); // <-- 注意这里
console.log(bar); // ? foo () {console.log(this.a)} <-- 打印bar,发现执行了 (p.foo = o.foo) 后,会有一个返回值,将该返回值赋值给 bar,打印出来的是全局函数 foo
bar(); // 2 <-- 相当于执行了  (p.foo = o.foo)() ,同上面那段代码中的最后一行

所以 (p.foo = o.foo)() 就相当于执行了 foo() ,此时可应用 this 的绑定规则之一——默认绑定来确定 this 对应的对象,即全局对象,所以 this.a 就是 2。

关于 this 的绑定规则,可参看 《你不知道的JavaScript》之“this全面解析”中的绑定规则一节。

原文地址:https://www.cnblogs.com/lwl0812/p/10347243.html

时间: 2024-10-19 20:46:30

this 绑定例外之间接引用的相关文章

编程题:指针变量,直接引用和间接引用的区别。

#include<stdio.h> void main() { int a,b; int *p;   /*定义指针变量p*/ p=&b;     /*将变量b的地址放在变量p中*/ a=3;      /*直接引用变量a*/ *p=5;     /* 间接引用变量b*/ printf("a=%d,b=%d\n",a,b); } 编程题:指针变量,直接引用和间接引用的区别.,布布扣,bubuko.com

创建了对嵌入的互操作程序集间接引用,无法嵌入互操作类型

警告 1 由于存在对由程序集“c:\Program Files\Reference Assemblies\Microsoft\VSTO40\v4.0.Framework\Microsoft.Office.Tools.Excel.dll”创建的程序集的间接引用, 因此创建了对嵌入的互操作程序集“c:\Program Files\Reference Assemblies\Microsoft\VSTO40\v4.0.Framework\Microsoft.Office.Tools.Common.dll

递归--一种直接或者间接引用自身的定义方法

引言:“盗梦空间”的电影.梦中梦,梦中梦,然后有时候循环. 我们在程序设计当中常常会遇到重复性的计算,我们最常用的方法是组织迭代循环,而我们除此之外还可以采用递归计算的方法. 递归的定义:递归是一种直接或者间接引用自身的定义方法.一个合法的递归一般包含俩个部分:基础部分和递归部分. 一些平时我们遇到的经典算法. 1.欧几里得递归,迭代算法 2.斐波那契数列 3.连续整数检测算法 4.逆序输出正整数的各位数 5.汉诺塔问题 6.排列产生算法 1.欧几里得递归,迭代算法 1 package com.

shell中变量的间接引用

在编写shell脚本的过程中相信大家都会遇到这样的场景: #!/bin/sh # log_1="xxxxxx" log_2="yyyyyy" log_3="zzzzzz" for num in {1..3} do     log=log_$num     #此时你想把log_1,log_2,log_3,这三个变量的变量值依次的for循环中引用,但是如果你直接echo     #出的变量,则只会输出你想引用的变量的变量名,而不是该变量的变量值,这里

Bash中${}的用法和变量的间接引用

在bash中${}用于设置变量默认值和字符串取值切片以及变量的间接引用,详细用法如下图,在Centos6下字符串取子${STR:POSITON:LENGTH},LENGTH为负数会报错. 1.${VAR},取出变量VAR值 [[email protected] ~]# a=hjks [[email protected] ~]# echo ${a} hjks 2.${VAR:-DEFAULT},VAR没有定义或者为空则输出$DEFAULT的值(VAR不变) [[email protected] ~

无法解析类型 javax.servlet.http.HttpServletRequest。从必需的 .class 文件间接引用

java.lang.Error: 无法解析的编译问题: 无法解析类型 javax.servlet.http.HttpServletRequest.从必需的 .class 文件间接引用了它 无法解析类型 javax.servlet.http.HttpServletResponse.从必需的 .class 文件间接引用了它 无法解析类型 javax.servlet.http.HttpSession.从必需的 .class 文件间接引用了它 无法解析导入 javax.servlet.http.Http

C变量的直接引用与间接引用区别

引用相比于于指针各有优点:一.引用变量它不能改变自身所引用的地址空间,而指针变量可以,那么就很可能出现一些因为不小心的修改而导致错误的结果.二.在作为函数参数方面,引用作为参数,你调用的时候不需要对变量取地址值,这样看起来比较直观,而且方便,如果是指针变量作为参数,那么你有时候会不明白这个函数到底是对指针进行运算,还是对指针指向的变量空间进行运算,而且还要取地址操作.三.不过有时候指针还是比引用好用的多,不如你需要快捷修改指向位置,那么指针是很快的,有时候你就是要对地址(就是直接对内存)操作,那

VS2012 error C2664: “std::make_pair”:无法将左值绑定到右值引用

例如:_mapTransportInfos.insert(std::make_pair<uint32, CTransportInfoPtr>(iter_t->m_nID, pinfo));这句代码在vs2012的c++11就无法编译,报2664错误.可以用如下强制转换来实现: 第一种方法(我这没成功)_mapTransportInfos.insert(std::make_pair<uint32, CTransportInfoPtr>(static_cast<uint32

Python中变量的绑定,或者说引用

print('The simple assignment') shoppingList = ['chicken','mango','apple','banana'] myList = shoppingList print('Before any action') print('The shopping list is',shoppingList) print('my list is',myList,'\n') print('Del the first item from the shopping