原文在这里。我写下来只是为了作个人笔记。
- 一、考虑以下代码的输出:
(function(){
var a = b = 5;
})()
console.log(b);
结果:5
代码有两个陷阱:
一,看上去是闭包空间内声明两个变量 a、b, 但事实是:a是匿名函数内用 var 声明的一个变量,而 b 不是。
b 被看做是一个全局变量,并在这个匿名函数内被赋值5,所以在函数外尝试对 b 取值是可行的, 但 a 不行。
二,并没有使用严格模式 'use strict',在严格模式下,会报错,因为严格模式要求显示调用全局变量:
(function(){
var a = window.b = 5;
})()
console.log(b);
- 二、创建内置方法: 给String对象创建一个repeatify方法,该方法接收一个参数作为字符串的重复次数,最后返回指定重复次数的字符串, 例如:
console.log(‘Hello’.repeatify(3));
输出 HelloHelloHello。
String.prototype.repeatify = String.prototype.repeatify || String.prototype.repeatify = function(num){
var str = '';
for (var i = 0; i < num; i++){
str += str;
}
return str;
}
这题检测我们原型方面的知识,也检测我们能否扩展内置数据类型方法。
- 三、考虑以下代码的输出:
function test(){
console.log(a);
console.log(foo());
var a = 1;
function foo(){
return 2;
}
}
test();
结果:undefined,2。
变量 a 和函数 foo 的声明都能被提升至外部函数 test 的顶部。
但此时的变量 a 并没有被赋值,也就是变量声明被提升,但赋值不会被提升。也就相当于 var a
声明在 console.log(a)
之前,但 a = 1
赋值在 console.log(a)
之后。上面代码相当于:
function test(){
var a;
function foo(){
return 2;
}
console.log(a);
console.log(foo());
a = 1;
}
test();
- 四、考虑以下代码的输出:
var name = 'Tom';
var obj = {
name: 'Jerry',
prop: {
name: 'Kitty',
getName: function(){
return this.name;
}
}
}
console.log(obj.prop.getName);
var test = obj.prop.getName;
console.log(test());
结果:Kitty,Tom
JavaScript 中 this 所指代的函数上下文,取决于调用的方式,而不是被定义的方式。
第一个 console.log() 中,getName 被 obj.prop 对象调用,于是返回obj.prop 的 name 属性值。
当 obj.prop.getName 赋值给全局变量 test 时,当前上下文指代全局对象(因为 test 被隐式看作是全局对象的属性),基于此,getName 返回 window 的 name。
- 五、修复前一个问题,是第二个 console.log() 输出 Kitty。
通过使用 apply() / call() 强制转换上下文:
console.log(test.apply(obj.prop));
或console.log(test.call(obj.prop));
[完]
网友评论