作用域:js是函数级作用域,在内部的变量在内部都可访问,外部不可访问内部变量。
函数执行时先收集变量,然后统一赋值。变量在自己可访问的范围内会被前置。这种行为被称为hoisting(悬置/置顶解析/预解析)
var i=10;
function test(){
console.log(i) //输出undefined
var i=1;
console.log(i) //输出1
}
闭 包: 在函数外部访问函数内部的变量,容易造成页面阻塞,因为执行以后不知道何时使用不能进行释放。
var i=10;
function test(){
var k=1000;
return function(){
return k;
}
}
console.log(test()()); //返回1000
t h i s: 谁调用它就指向谁。
this指向的例子:
- this指向window
console.log(this); //此处this就是window this.m=100; function test(){ console.log(this.m) //因为是window调用test,所以this指向window } window.test();
- this指向调用它的对象
this.m=1000; var obj = { m:100, test:function(){ alert(this.m); //100 } } obj.test() //obj调用this,所以this指的是obj
- 闭包里面的this,指向window
this.m=1000; var obj = { m:100, test:function(){ alert(this.m); return function(){ alert(this.m); } } } ~obj.test()() //关于自执行函数,详见此博客
- dom 对象的this指向
按引用传值的:array,object(会在原来的基础上增加属性以及值)<input type="button" value="点击" id="change" style="color:yellow"> <script> document.getElementById("change").οnclick=test; function test(){ this.style.color="red"; alert(this.style.color) } </script>
按值传递的:string,num,boolean(会改变原有的值)