alert(a)
a()
var a=3;
function a(){
alert(10)
}
alert(a)
a=6;
a();
- var 和函数都会提升到作用于顶端
- 对于函数名与变量重名的情况,优先选择变量,若变量值无意义选择函数
var a = 20;
var test = {
a: 40,
init: function() {
console.log(this.a);
function go() {
console.log(this.a);
}
go.prototype.a = 50;
return go;
}
};
var p = test.init();
p();
new(test.init())();
- this指向谁调用指向谁
- 构造函数优先级高于原型链
(function () {
"use strict";
this.a = 20;
var test = {
a: 40,
init: () => {
console.log(this.a)
}
};
var res = test.init().bind(undefined);
res();
})()
- 以上代码会报错,因为res是window调用的,严格模式下找不到window,this=>undefined
- 关于软绑的意义参考:关于js的软绑定
function test(m) {
m = {v:5}
}
var m = {k: 30};
test(m);
alert(m.v);
- js函数的参数是按值传递,所以里面的m被指向了一个新的地址,跟外部的m脱离了关系
function joke() {
console.log(1);
}
(function () {
if (false) {
function joke() { console.log(2);}
}
joke();
})();
- 你不知道的JavaScript中答案为2,这属于早期浏览器函数提升导致的
- 当前版本会把joke当变量提升到函数作用域最顶端,也就是var joke = undefined;所以自然不是一个函数
function fn() {
console.log(this.length);
}
var yideng = {
length: 5,
method: function(fn) {
fn();
arguments[0]();
}
};
yideng.method(fn, 1);
- 惊了不?为什么window.length === 0?因为window.length等于页面iframe的个数,因为有一个iframe标签就有一个window
- arguments0;其实是arguments在调用fn,所以输出arguments.length