Chor

Results 22 comments of Chor

> function Person(name){ > this.nickname = name; > this.distractedGreeting = function() { > > ``` > setTimeout(function(){ > console.log("Hello, my name is " + this.nickname); > }.bind(this), 500); > }...

> // 第四版,已通过测试用例 > Function.prototype.bind2 = function (context) { > var self = this; > var args = Array.prototype.slice.call(arguments, 1); > > ``` > var fNOP = function () {};...

`call` 的实现有几个问题: - 传进去的 `context` 如果是 null 或者 undefined 的话,this 会指向全局对象,这里全局对象不一定是 window 吧(非浏览器环境),window 换成 globalThis 可能更好 - 如果 `context` 是 false 的话,最终 this 会指向全局对象,但实际上它应该指向 `Boolean {false}` - 在一开始应该先检查 context 是否是函数,不是的话要抛出一个错误...

在ES6中,this binding好像并入了词法环境中,也就是执行上下文的创建阶段实际是: 1.词法环境 2.变量环境 作者原文已经修改了,https://blog.bitsrc.io/understanding-execution-context-and-execution-stack-in-javascript-1c9ea8642dd0 但是掘金的译文目前没有更正。

结果: undefined {n:2} 首先,a和b同时引用了{n:2}对象,接着执行到a.x = a = {n:2}语句,尽管赋值是从右到左的没错,但是.的优先级比=要高,所以这里首先执行a.x,相当于为a(或者b)所指向的{n:1}对象新增了一个属性x,即此时对象将变为{n:1;x:undefined}。之后按正常情况,从右到左进行赋值,此时执行a ={n:2}的时候,a的引用改变,指向了新对象{n:2},而b依然指向的是旧对象。之后执行a.x = {n:2}的时候,并不会重新解析一遍a,而是沿用最初解析a.x时候的a,也即旧对象,故此时旧对象的x的值为{n:2},旧对象为 {n:1;x:{n:2}},它被b引用着。 后面输出a.x的时候,又要解析a了,此时的a是指向新对象的a,而这个新对象是没有x属性的,故访问时输出undefined;而访问b.x的时候,将输出旧对象的x的值,即{n:2}。 ------ 上面是之前写的解释,最近看周爱民老师的文章的时候,发觉这部分解释有不少地方没说到本质上,有的还是错误的,所以我重新结合老师的文章研究了一下,修改如下: 以这段代码为例: ```js var a = {n:1}; a.x = a ={n:2}; console.log(a.x); ``` 代码 | 注释...

> const promise = new Promise(async (resolve, reject) => { > console.log(1) > await resolve() > console.log(2) > }) > > promise.then(() => { > console.log(3) > }) > >...

> ```js > // 方法1 利用for的变量i 输出99-0 > function print(n){ > setTimeout(() => { > console.log(--i); > }, Math.floor(Math.random() * 1000)); > } > for(var i = 0; i <...

> > > ```js > > > // 方法1 利用for的变量i 输出99-0 > > > function print(n){ > > > setTimeout(() => { > > > console.log(--i); > > > },...

> > 每次跑循环的时候,setTimeout里的n都已经确定为对应的数字了,之后真正执行的时候,没有作用域查找n这个过程了。这样子吗? > > 你理解的偏太远了,timer方法作用域内没有找到n,于是去上一级作用域链print方法内找,找到了n,就是一个值,结束。和外面的for没一点关系了,你自己先想想。 既然只有一个n,那么每一个timer对于n的查找,最后找到的都会是值为99的n,所以我才问是不是n在循环的时候就确定了,因为如果在循环的时候确定了,那么每一个timer就会有正确的对应数字,不会都输出99。