返回信息流如何理解??
这是一条镜像帖。来源:北邮人论坛 / www-technology / #35104同步于 2016/3/28
该镜像源已超过 30 天没有更新,可能在源站已被删除。
WWWTechnology机器人发帖
这道js笔试题为啥输出10?
ztinpn
2016/3/28镜像同步22 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
fn在obj内调用的为啥this没指向obj呢?
【 在 cocoyimasa (【意涵团】迷路的枫酱) 的大作中提到: 】
: 因为this指针绑定的是window。window.length=10。
标准就是这么定义的.
在严格模式下,输出10的那次的fn的this实际是undefined,在非严格模式下才成为了global.
至于第二的arguments[0]()的输出,你就想一下,arguments[0]就是fn,相当于arguments['fn'](实际上只能用index来获得,这么写是方便你理解),这个this是arguments.
其实绑定this的,除了显式的bind,apply,call,就是通过object.foo或者object['foo']来绑定
————
微博 @flowmemo 现在主要写JavaScript. 关注广泛, 欢迎交流.
赞个
【 在 e97ace 的大作中提到: 】
: 标准就是这么定义的.
:
: 在严格模式下,输出10的那次的fn的this实际是undefined,在非严格模式下才成为了global.
:
: 至于第二的arguments[0]()的输出,你就
: .........
发自「贵邮」
打个比方,转基因那么简单的话,人家学生物的就不用搞各种高新技术了...
this 首先是在运行时根据函数的执行环境绑定的,指向就那么几种,点击这里《JavaScript 秘密花园》(这题是里面写的第一个常见误解╮(╯▽╰)╭):
* 作为一个对象的方法调用的时候,this 指向那个对象,比如 obj.fn()
* 作为一个普通函数(或者匿名函数)调用的时候,指向全局对象 window,比如 fn(),(这题属于这种情况,就算你把函数定义在里面也一样...)
* 构造函数中 this 指向实例化的对象
* 还有使用 call 和 apply 动态改变 this 的指向
举几个《JavaScript 高级程序设计》上第七章的栗子...
1. 不符合预期的闭包
var name = "The Window";
var object = {
name: "My Object",
getNameFunc: function() {
return function() {
return this.name;
};
}
};
alert(object.getNameFunc()());
// The Window (非严格模式下),
// 此处有两个括号,因为 object.getNameFunc() 是一个匿名函数,
// 后一个括号是匿名函数调用。
为什么匿名函数没有取得其包含作用域(或外部作用域)的 this 对象呢?
前面曾经提到过,每个函数在被调用时都会自动取得两个特殊变量:this 和 arguments。而内部函数在搜索这两个变量时,只会搜索到其 AO 为止,所以永远不能直接访问到外部函数中的 this 和 arguments。
不过若是我们将外部作用域中的 this 对象保存在一个闭包能够访问到的变量里,就可以让闭包访问到该对象了:
2. 符合预期的闭包
var name = "The Window";
var object = {
name: "My Object",
getNameFunc: function() {
var that = this;
// 使用 that 保存外部函数的 this
//(防止被内部函数的 this 屏蔽)
return function() {
return that.name;
// 由于访问的是内部 AO 中没有的变量 that,
// 所以在 SC 中外部的 AO 上搜索,
// 得到外部函数的 this。
};
}
};
alert(object.getNameFunc()()); // My Object
3. 奇怪的栗子╮(╯▽╰)╭
var name = "The Window";
var object = {
name: "My Object",
getName: function() {
return this.name;
}
};
object.getName(); // My Object,很好理解 this 就是指向 object
(object.getName)();
// My Object,虽然将函数包了起来,
// 但还是通过 object.getName 调用,this 还是指向 object
(object.getName = object.getName)();
// The Window(非严格模式下),看起来很奇怪,
// 将函数 getName 赋值为 getName,再调用赋值后的结果
// 因为赋值表达式操作的是 getName 函数本身,
// 所以 this 的值没有得到维持,调用时指向了 widnow。
【 在 ztinpn 的大作中提到: 】
: 如何理解??