作用域
js 是函数级作用域,而其他的语言则是块级作用域
js中内部声明的变量内部都能访问的到
function test(){
if(false){
var i = 2;
}
console.log(i)
}
//这里报的错是undefined 而不是not define(如果console.log(j)这样才报的是not define)
undefined 和not define 是完全不同的两种东西,前者是声明但是未赋值,后者是压根连声明都没有
test();
var j = 1000;
function test(){ console.log(j)}
//这里报的错依旧是undefined 而不是not define
其实js真正的执行顺序是这样子的
var j;
test();
j = 1000;
...
闭包
就是拿到本不该属于他的东西
容易造成内存泄露
function test(){
var t = 10
}
//如果要在外部获取到函数内部的这个t,就应该如下面这种做法
function test(){
var t = 10;
return function(){
return t;
}
}
var outerT = test()();
~
1.后面跟数字
var n = ~10;//n = -11
~是按位 取反 的意思,但之所以这个取反之后是11而不是10的原因是
它的取反和我们的取相反数有一点区别,它是想把这个数10转换为 二进制数 0000000000000000001010 ,再对这个二进制数取反,0变1, 1变0,是 1111111111111111110101,最后再转换回十进制数就是-11了。
2. ~func()
~function demo(){
console.log(123)
}()
//方法执行, 这里的~ 的作用就是把后面的这个方法转换成一个表达式。
需要注意的是
var s = ~function(){
...
//或者return 非数字
}()
//这时候的s = -1;
var s = ~function(){}
//~fun 而不是~fun()时候,s的值也是为-1
var s = ~ function (){
return Number
}()
//这时候的s = Number按位取反后的值