1. js原声基础,创建原声方法
给字符串定义一个方法,当传入一个正整数N时,结果返回N次字符串。
例如:console.log('hello'.repeatify(3));
控制台打印结果:hellohellohello。
需注意指定方法名称,但字符串自身不带有repeatify方法。
答案
可能不够标准,仅供参考.
String.prototype.repeatify = String.prototype.repeatify || function (N) {
var str = '';
for (var i = 0; i < N; i++) {
str += this;
}
return str;
}
console.log('hello'.repeatify(5));
总结:现在的问题测试开发者有关JavaScript继承和prototype的知识点。这也验证了开发者是否知道该如何扩展内置对象(尽管这不应该做的)。
这里的另一个要点是,你要知道如何不覆盖可能已经定义的功能。通过测试一下该功能定义之前并不存在,所以:
String.prototype.repeatify = String.prototype.repeatify || function (N){/* code here */};
2. 声明提升
如下,输出结果是什么呢
function test() {
console.log(a);
console.log(foo());
var a = 1;
function foo() {
return 2;
}
}
test();
相信基础扎实的小伙伴肯定可以答对。
答案
undefined
2
解释:
原因是,变量和函数的声明都被提前了(移到了函数的顶部),但变量不分配任何值。因此,在打印变量的时候,它在函数中存在(它被声明了),但它仍然是 undefined 。表示换句话说,上面的代码等同于以下内容:
function test() {
var a;
function foo() {
return 2;
}
console.log(a);
console.log(foo());
a = 1;
}
test();
3. this在JavaScript中是如何工作的
下面代码输出结果是什么?
var fullname = 'John Doe';
var obj = {
fullname: 'Colin Ihrig',
prop: {
fullname: 'Aurelio De Rosa',
getFullname: function() {
return this.fullname;
}
}
};
console.log(obj.prop.getFullname());
var test = obj.prop.getFullname;
console.log(test());
需注意这题主要考察this的指向问题。
答案
Aurelio De Rosa
John Doe
原因是,在一个函数中,this的行为,取决于JavaScript函数的调用方式和定义方式,而不仅仅是看它如何被定义的。
在第一个 console.log()调用中,getFullname() 被调用作为obj.prop对象的函数。所以,上下文指的是后者,函数返回该对象的fullname。与此相反,当getFullname()被分配到test变量时,上下文指的是全局对象(window)。这是因为test是被隐式设置为全局对象的属性。出于这个原因,该函数返回window的fullname,即定义在第一行的那个值。
回答正确的同学请看附加题。
附加题:
同样是上面的代码,如何使最后的console.log() 打印 Aurelio De Rosa?
需注意这题主要考查的是如何改变this的指向。
答案
console.log(test.call(obj.prop));
没错,当我们需要改变this指向是我们可以使用call(),apply()以及bind方法,但这种情况我们通常使用call()。
最后一个思考题
call()和apply()的区别是什么?
慢慢思考…
如有错误请指出,谢谢,希望在找工作的朋友们,早日找到满意的工作。