关于this 的一个问题
var name = "the window"; var object = { name:"my object";
getName:function(){
return this.name;
}
}; object.getName(); //"my object"
(object.getName)(); //"my object"
(object.getName=object.getName)(); //"the window"
为什么呢?
(object.getName)()
与object.getName()
的等价的,因为xxx.xxx
(成员访问) 的优先级高于xxx(xxx)
(函数调用),所以加不加圆括号不影响结果(关于运算符优先级可参考 运算符优先级);(object.getName=object.getName)
是一个赋值表达式,赋值表达式求值结果是右值
,所以该表达式的值是getName函数
。你可以这么理解:(object.getName=object.getName)()
等价于var b; (b=object.getName)()
等价于var b; b=object.getName; b()
;严格模式下,
(object.getName=object.getName)()
会报错,因为严格模式下,禁止 this 关键字指向全局对象。
函数里的 this 取决于你调用它时的上下文。
当函数作为对象的方法调用时,this 指向这个对象。
当你直接执行它时,this 指向 window。
你还可以用
call
,applay
,bind
方法来指定this
。
下面有一段示例帮助你理解:
var say = function () {
console.log('My name is', this.name);
}; var jack = {
name: 'Jack',
say: say
}; var rose = {
name: 'Rose',
say: say
}; jack.say(); // My name is Jack
rose.say(); // My name is Rose window.name = '世界之窗';
say(); // My name is 世界之窗
题目里的(object.getName=object.getName)();
这种写法有意思的地方在于,object.getName=object.getName
这个赋值操作的返回结果是下面这个函数体,
function(){
return this.name;
}
所以整个这一句的执行结果等同于
(function(){
return this.name;
})();
结合此答案最前面提到的第 2 点,可知这里的this
就指向window
。
关于this 的一个问题的更多相关文章
- 为什么很多人坚信“富贵险中求”?
之家哥 2017-11-15 09:12:31 微信QQ微博 下载APP 摘要 网贷之家小编根据舆情频道的相关数据,精心整理的关于<为什么很多人坚信"富贵险中求"?>的 ...
- python基础全部知识点整理,超级全(20万字+)
目录 Python编程语言简介 https://www.cnblogs.com/hany-postq473111315/p/12256134.html Python环境搭建及中文编码 https:// ...
- Tomcat一个BUG造成CLOSE_WAIT
之前应该提过,我们线上架构整体重新架设了,应用层面使用的是Spring Boot,前段日子因为一些第三方的原因,略有些匆忙的提前开始线上的内测了.然后运维发现了个问题,服务器的HTTPS端口有大量的C ...
- 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑
阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...
- 如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成
阅读目录 前言 建模 实现 结语 一.前言 前面几篇已经实现了一个基本的购买+售价计算的过程,这次再让售价丰满一些,增加一个会员价的概念.会员价在现在的主流电商中,是一个不大常见的模式,其带来的问题是 ...
- SQLSERVER将一个文件组的数据移动到另一个文件组
SQLSERVER将一个文件组的数据移动到另一个文件组 有经验的大侠可以直接忽视这篇文章~ 这个问题有经验的人都知道怎麽做,因为我们公司的数据量不大没有这个需求,也不知道怎麽做实验 今天求助了QQ群里 ...
- 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)
通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...
- 【造轮子】打造一个简单的万能Excel读写工具
大家工作或者平时是不是经常遇到要读写一些简单格式的Excel? shit!~很蛋疼,因为之前吹牛,就搞了个这东西,还算是挺实用,和大家分享下. 厌烦了每次搞简单类型的Excel读写?不怕~来,喜欢流式 ...
- 如何一步一步用DDD设计一个电商网站(十)—— 一个完整的购物车
阅读目录 前言 回顾 梳理 实现 结语 一.前言 之前的文章中已经涉及到了购买商品加入购物车,购物车内购物项的金额计算等功能.本篇准备把剩下的购物车的基本概念一次处理完. 二.回顾 在动手之前我对之 ...
- 通过一个demo了解Redux
TodoList小demo 效果展示 项目地址 (单向)数据流 数据流是我们的行为与响应的抽象:使用数据流能帮我们明确了行为对应的响应,这和react的状态可预测的思想是不谋而合的. 常见的数据流框架 ...
随机推荐
- Servo: The Embeddable Browser Engine
Embedding, in the context of this article, is the process of hosting a web rendering engine inside a ...
- 用F340 GPIO做I2C
在和Qinheng开发小尺寸点灯治具中,F340和FPGA采用I2C通信,其中F340作为I2C的主机,I2C端口用自己的GPIO编写,总结遇到的问题及注意事项: 1. F340端口及上拉电阻设置: ...
- WIN10 + VS2015 + WDK10 + SDK10 + VM虚拟机驱动开发调试环境搭建
http://blog.csdn.net/qing666888/article/details/50858272#comments
- C#中的四舍五入算法
最近在产品开发过程中遇到一个问题,就是在对数值进行截取,例如说保留两位小数时,最终得到的结果跟预期的在某些情况下会产生差异,这个差异的表现就是最后一位与预期的不一致,也就是说在"四舍五入&q ...
- MySQL中的类Decode用法
SELECT DISTINCT ( CASE ' THEN '关羽' ' THEN ' 张飞' ' THEN ' 赵云' ' THEN ' 马超' ' THEN ' 黄忠' ' THEN ' 魏延' ...
- Robot Framework安装
Robot Framework(中文站/社交化知识社区,源码)是一款Python编写的通用开源功能测试自动化框架,以作验收测试和验收测试驱动开发(ATDD),它是一种使用表格测试数据语法的关键字驱动的 ...
- netcat运行出错
今天项目上利用运行netca创建监听时报错,(运行netmgr可以弹出窗口,未测试是否可以建立监听) 报错信息: [oracle@BSS-WG2 ~]$netca Oracle Net Service ...
- codeforces 385C Bear and Prime Numbers 预处理DP
题目链接:http://codeforces.com/problemset/problem/385/C 题目大意:给定n个数与m个询问区间,问每个询问区间中的所有素数在这n个数中被能整除的次数之和 解 ...
- UVA 465 (13.08.02)
Overflow Write a program that reads an expression consisting of twonon-negative integer and an ope ...
- tabhost中activity跳转动画不显示的解决办法
[1]如果是tabhost中的activity跳到其他的activity,用这篇blog的方法即可 http://blog.sina.com.cn/s/blog_8db8914301010t31.ht ...