Comments (29)
请问这个题又如何解释?
var value = 1;
var foo = {
value: 2,
bar: function () {
return this.value;
}
}
//示例1
console.log(foo.bar());
//示例2
console.log((foo.bar)());
//示例3
console.log((foo.bar = foo.bar)());
//示例4
console.log((false || foo.bar)());
//示例5
console.log((foo.bar, foo.bar)());
from blog.
from blog.
学习了
from blog.
学习了
from blog.
niu
from blog.
厉害
from blog.
嗯呢,忘记修改了其它平台已经更新过
非常感谢👍
from blog.
棒🎉, 期待之后的文章
from blog.
非常感谢
from blog.
有种特殊情况,当this遇到return,如果返回值是一个对象,那么this指向的就是那个返回的对象,如下:
function fn() {
this.name = 'james';
return {};
}
let a = new fn;
console.log(a.name); // undefined
from blog.
请问这个题又如何解释?
var value = 1;var foo = {
value: 2,
bar: function () {
return this.value;
}
}//示例1
console.log(foo.bar());
//示例2
console.log((foo.bar)());
//示例3
console.log((foo.bar = foo.bar)());
//示例4
console.log((false || foo.bar)());
//示例5
console.log((foo.bar, foo.bar)());
老哥,你这题有点意思啊
from blog.
请问这个题又如何解释?
var value = 1;var foo = {
value: 2,
bar: function () {
return this.value;
}
}//示例1
console.log(foo.bar());
//示例2
console.log((foo.bar)());
//示例3
console.log((foo.bar = foo.bar)());
//示例4
console.log((false || foo.bar)());
//示例5
console.log((foo.bar, foo.bar)());
第一个和第二个比较好理解,都是2。绑定规则+符号优先级可以解释。
示例3/4/5不太理解内部的运行步骤,平时也没遇到过这样的写法。
大佬,解释一下呢~
from blog.
有种特殊情况,当this遇到return,如果返回值是一个对象,那么this指向的就是那个返回的对象,如下:
function fn() {
this.name = 'james';
return {};
}
let a = new fn;
console.log(a.name); // undefined
感谢~
如果return一个对象或者是function的话,this指向的是这个对象或者是function~
非常非常感谢~
from blog.
mark
from blog.
请问这个题又如何解释?
var value = 1;var foo = {
value: 2,
bar: function () {
return this.value;
}
}//示例1
console.log(foo.bar());
//示例2
console.log((foo.bar)());
//示例3
console.log((foo.bar = foo.bar)());
//示例4
console.log((false || foo.bar)());
//示例5
console.log((foo.bar, foo.bar)());
感觉可以从运算符优先级下手。后三个示例分别做了赋值运算、逻辑运算、逗号运算,在这过程中对foo.bar求值,这导致丢失this隐式绑定?
from blog.
一道题就涉及到闭包、this作用域、IIFE 赞赞赞赞
from blog.
perfect,讲解的很详细了
from blog.
很受用,非常棒
from blog.
箭头函数的解释第3步解释有误,this还是对象,应该是赋值给全局中的变量时候出现隐式绑定丢失sayHi: function(){
console.log(this);
return function() {
console.log(this);
return ()=>{
console.log(this);
}
}
}
箭头函数前加多一个输出this,输出obj对象
from blog.
醍醐灌顶,感谢
from blog.
讲的很到位,思路很清晰
from blog.
但是如果在node环境中运行,结果就是 Hello,undefined.这是因为node中name并不是挂在全局对象上的。
这个结论不太对,试过了一样的,node6.3.0、10.15.3都试过
from blog.
//示例1
console.log(foo.bar());
//示例2
console.log((foo.bar)());
//示例3
console.log((foo.bar = foo.bar)());
//示例4
console.log((false || foo.bar)());
//示例5
console.log((foo.bar, foo.bar)());
请问这个题又如何解释?
示例 3, 4, 5 都是创建了一个新的函数 而不是执行的foo.bar本身
from blog.
写的太棒了👏
from blog.
请问这个题又如何解释?
var value = 1;
var foo = {
value: 2,
bar: function () {
return this.value;
}
}
//示例1
console.log(foo.bar());
//示例2
console.log((foo.bar)());
//示例3
console.log((foo.bar = foo.bar)());
//示例4
console.log((false || foo.bar)());
//示例5
console.log((foo.bar, foo.bar)());第一个和第二个比较好理解,都是2。绑定规则+符号优先级可以解释。
示例3/4/5不太理解内部的运行步骤,平时也没遇到过这样的写法。
大佬,解释一下呢~
示例2不太明白呢,我的理解是,相当于把foo.bar的值赋值给另一个变量,然后执行这个变量,这个时候,this不是应该指向window了吗
from blog.
//示例1
console.log(foo.bar());
//示例2
console.log((foo.bar)());
//示例3
console.log((foo.bar = foo.bar)());
//示例4
console.log((false || foo.bar)());
//示例5
console.log((foo.bar, foo.bar)());请问这个题又如何解释?
示例 3, 4, 5 都是创建了一个新的函数 而不是执行的foo.bar本身
感觉示例2也不是执行foo.bar本身,我知道我这么理解是错误的,但我不知道为啥错,求解释
from blog.
from blog.
var value = 1;
var foo = {
value: 2,
bar: function () {
return this.value;
}
}
//示例1
console.log(foo.bar());
//示例2
console.log((foo.bar)());
//示例3
console.log((foo.bar = foo.bar)());
//示例4
console.log((false || foo.bar)());
//示例5
console.log((foo.bar, foo.bar)());
应该是这样:
foo.bar()在执行过程中会将foo作为隐式形参传给this,因此foo.bar()还是(foo.bar)()最终打印出来的都是2。因为编译器会进行优化将(foo.bar)()优化为foo.bar()。
至于(foo.bar = foo.bar)()和(false || foo.bar)()以及(foo.bar, foo.bar)(),或者其他的先对foo.bar进行运算,然后再执行,都会输出同样的结果1,是因为,运算过程中的this一直指向global。
foo.bar()执行过程是,经历两次RHS,找到foo.bar,创建bar作用域,创建bar作用域链,将foo赋值给this,调用[[call]]内部代码。此时this指向foo。
(foo.bar = foo.bar)执行过程是右侧foo.bar进行两次RHS找到bar,左侧foo.bar进行一次RHS,一次LHS找到bar,然后根据右侧找到的bar,给左侧找到的bar赋值,这个过程中的this是指向global的,然后去运行bar(),而不是运行foo.bar(),单独运行函数bar()过程中,this在非严格模式的默认情况下会指向global。这个过程中不存在两次RHS----foo,bar,然后直接运行bar函数的过程。
from blog.
解释器在运行的过程中执行[[call]]的时候判断本次RHS之前经历的也是RHS,然后找前一个RHS得到的结果foo赋值给this。但是执行[[call]]之前的最后一步是赋值操作foo.bar = foo.bar,所以就去找默认的this即global了。
from blog.
Related Issues (20)
- 【面试篇】寒冬求职季之你必须要懂的原生JS(中) HOT 7
- 【面试篇】寒冬求职之你必须要懂的Web安全
- 细说JS异步发展历程
- 【Step-By-Step】一周面试题深入解析 / 周刊 01 HOT 2
- 【Step-By-Step】一周面试题深入解析 / 周刊02
- 【Step-By-Step】一周面试题深入解析 / 周刊03
- 【Step-By-Step】一周面试题深入解析 / 周刊04 HOT 2
- 这儿有20道大厂面试题等你查收 HOT 4
- 【Step-By-Step】高频面试题深入解析 / 周刊05
- 【Step-By-Step】高频面试题深入解析 / 周刊06
- 【Step-By-Step】高频面试题深入解析 / 周刊07 HOT 2
- 【中高级前端必备】手摸手教你撸一个脚手架 HOT 1
- Proxy及其优点
- 深入理解全能的 Reducer HOT 1
- 可靠React组件设计的7个准则之SRP
- 可靠React组件设计的7个准则之封装
- eos-cli中npm link的时候报错
- React中组件逻辑复用的那些事儿
- 这些热门 GitHub 代码库,每个前端开发者都应该收藏
- to-redux2中代码运行出错 HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from blog.