JS题目
1.JS中function声明和var声明都会被提前
function bar() {
function foo() {}
return foo;
foo = 10;
var foo = 11;
}
alert(typeof bar());
在return之后声明和赋值的foo都无效,所以返回了function。
等同于:
function bar() {
function foo() {}
return foo;
foo = 10;
var foo = 11;
}
alert(typeof bar());
JS中function声明和var声明都会被提前,最终得到结果为function,是因为名称解析顺序-Name Resolution Order, 导致的function声明优先级大于var声明,而不是由return语句退出导致最后的结果~
2.参数 arguments
function foo(a) {
alert(arguments.length);
}
foo(1, 2, 3);
- 1
- 2
- 3
- undefined
答案3,arguments取的是实参的个数,而foo.length取的是形参个数。 实参可以直接从arguments数组中修改。
3.
arugments 是一个伪数组,然后会将他转化成为标准数组。通常方法是使用 Array.prototype.slice ,像这样:
function log(){
var args = Array.prototype.slice.call(arguments);
args.unshift('(app)'); //给每一个 log 消息添加一个"(app)"的前辍 比如:'(app) hello world'
console.log.apply(console, args);
};
4.上下文
var User = {
count: 1,
getCount: function() {
return this.count;
}
};
console.log(User.getCount());
var shangxia= User.getCount;
console.log(shangxia());
输出的会是什么。1和 undefined
shangxia是在 winodw 的上下文中被执行的,所以会访问不到count属性。
怎么样保证User总是能访问到shangxia的上下文,即返回正即的值:1
使用 Function.prototype.bind ,例如:
var shangxia= User.getCount.bind(User);
console.log(shangxia());