Javascript变量
一、变量
基本类型 | 引用类型 |
不可修改 | 可以修改 |
保存在栈内存中 | 保存在堆内存中 |
按值访问 | 按引用访问 |
比较时,值相等即相等 | 比较时,同一引用才相等 |
复制时,创建一个副本 | 复制的其实是指针 |
按值传递参数 | 按值传递参数 |
用typeof检测类型 | 用instanceof检验类型 |
基本类型复制时,创建一个副本,对副本的操作与原来的值不相干的,引用类型的复制其实是指针,这样子新的变量指向的就是同一个东西了,这样子你对某一个变量进行操作,其实是会影响另一个变量的。
二、作用域
1. 作用域有全局作用域和局部作用域之分。
2. 作用域链是用来查询变量的(由内往外)
3. JS解析机制
a.预解析
b.逐行解析
(1)把变量的声明提升到当前作用域的最前面,只会提升声明,不会提升赋值。 (2)把函数的声明提升到当前作用域的最前面,只会提升声明,不会提升调用。 (3)先提升 var,在提升 function |
因此我们定义函数时,绝大数使用第一种方式(函数声明的方式)
当匿名函数多于定时器里面和注册事件的时候,比如:
<script>
btn.onclik = function(){
console.log("这是一个匿名函数”);
}
</script>
2.预解析示例:
<script>
var num = 789;
function fn(){
console.log(num);
var num = 789;
}
fn();
</script>
此时控制台打印的是undefined,原因是:JS解析代码时,把函数的声明还有变量的声明提升到当前作用域的最前面,所以代码就变成:
<script>
var num;
num = 789;
function fn(){
var num;
console.log(num);
num = 789;
}
fn();
</script>
三、自执行函数
(1)第一种写法
<script>
(function(){
console.log("这是一个自执行函数");
})();
</script>
这样写的原理是:由函数表达式演变过来的,var fn = function(){}fn(); 把fn替换为:function(){},就成了:function(){}(); 为了保持整体性,在function加上一个(),所以就变成了(function([这里是形参]){}) ([这里是实参])
(2)第二种写法
、 <script>
(function(){
console.log("这是一个自执行函数");
}());
</script>
四、闭包
对于闭包,当外部函数返回之后,内部函数依然可以访问外部函数的变量。
function f1(){
var N = 0;
function f2(){
N += 1;
console.log(N);
}
return f2;
}
var result = f1();
result();
result();
result();