1、变量作用域和闭包
function test(){
if(false){
var i=10}
else{
var t=100;
}
alert(t);}
test();
//js是函数级别的作用域,在内部的变量,内部都能访问,外部不能访问内部的,内部能访问外部的
var j=100;
~(function test(){
console.log(j);})();
//波浪线才能有意义,是把~后的一块变成一个表达式然后输出
var j=100;
function test(){
var j;
alert(j);
j=10;}
test();
结果:undefine,,因为内部的var j;把外部的var j=1001给干掉了,内部的j=10;还没赋值就已经输出了
闭包:
function test(){
var k=1000;
return function(){
return k;
}
}
var t=test()();
alert(t);
//闭包:就是拿到本不该属于自己的东西
2、this指针的使用:谁调用它,this就指谁
this.m=1000;
var obj={
m:100;
test:function(){
alert(this.m);
}
}
obj.test();
结果:100;因为调用了obj的this。
加入闭包特殊情况
this.m=1000;
var obj={
m:100;
test:function(){
alert(this.m);
}
return function(){
alert(this.m);
}
}
(obj.test())(); 或者 var t=obj.test(); window.t();s
this.a=1000;
function test(){
this.a=1;
}
test.prototype.geta=function(){
return this;
};
var p=new test;
console.log(p.geta());
//prototype 属性使您有能力向对象添加属性和方法
结果:p是test()new出来的,p.geta()=1;因为调用了geta的this,通过prototype给原形test的this添加了方法,this又是test()中this.a=1。
3、按值传递和按引用传递
function test(num){
num=num+1;
return num;
}
var num=1;
alert(test(num));
结果:2
//按值传递
function test(num){
//这里对num这个变量创建了一个内存的副本
var num=num+1;
return num;
}
var num=1;//此时num为number
alert(test(num);
alert(num);
结果:首先弹出2 ,然后弹出1
//按引用传递
function test(obj){
//当前的Obj对内存的这个地址指向同一个
obj.age='20';
console.log("inner","obj");
}
var obj={ //此时Obj为对象
name:"xiaoming";
}
test(obj);
console.log('outer',obj);
结果:inner Object{name:"xiaoming",age:"20"}
outer Object{name:xiaoming",age:"20"}
//引用类型:js对象,object,array
//值类型:string ,number,boolean