- this对象的理解
this总是指向函数的直接调用者
如果有new的话,指向new出来的对象
在事件中,this指向触发这个事件的对象
- new操作符都干了什么?
创建一个空对象,并且this变量引用该对象,同时继承该对象的原型。
属性和方法加入到this引用的对象中
新创建的对象由this引用,并且最后隐式返回this。
- call() , apply(), bind() 区别
- object.prototype 理解
定义一个spcify()函数
spacify('hello world') => 输出 ‘h e l l o w o r l d’
进一步实现
‘hello world’.spaciy()
String.prototype.spacify = function(){
return this.prototype.split().join(' ')
}
- 函数声明 和函数表达式的区别
对于函数声明,js解析器会优先读取,确保在所有代码执行之前声明已经被解析,而函数表达式,如同定义其它基本类型的变量一样,只在执行到某一句时也会对其进行解析,所以在实际中,它们还是会有差异的,具体表现在,当使用函数声明的形式来定义函数时,可将调用语句写在函数声明之前,而后者,这样做的话会报错。
- 参数arguments理解
定义个log函数,添加(app)的前缀
- context 上下文
下一组问题是考察侯选人对上下文和this的理解。我先定义了下面一个例子。注意count属性不是只读取当前下下文的。
var User = { count: 1, getCount: function() { return this.count; } };
我又写了下面几行,然后问侯选人log输出的会是什么。
console.log(User.getCount()); var func = User.getCount; console.log(func());
这种情况下,正确的答案是1和undefined。你会很吃惊,因为有很多人被这种最基础的上下文问题绊倒。func是在winodw的上下文中被执行的,所以会访问不到count属性。我向侯选人解释了这点,然后问他们怎么样保证User总是能访问到func的上下文,即返回正即的值:1
正确的答案是使用Function.prototype.bind,例如:
var func = User.getCount.bind(User); console.log(func());
接下来我通常会说这个方法对老版本的浏览器不起作用,然后让侯选人去解决这个问题。很多弱一些的侯选人在这个问题上犯难了,但是对于你来说雇佣一个理解apply和call的侯选人非常重要。
Function.prototype.bind = Function.prototype.bind || function(context){ var self = this; return function(){ return self.apply(context, arguments); }; }