基本类型和引用类型的赋值问题
function dolby(a, b, c) {
a = 2;
b.color = 'red';
c = {
color: 'black'
}
console.log(a); //2
console.log(b); //{color:'red'}
console.log(c); //{color:'black'}
}
var a = 1;
var b = {
color: 'blue'
}
var c = {
color: 'white'
}
dolby(a, b, c);
console.log(a); //1
console.log(b); //{color:'red'}
console.log(c); //{color:'white'}
上例很好地证明了:基本类型值按值传递,引用类型值按引用传递
同名变量和方法覆盖问题
var fn = 3;
function fn(){};
console.log(fn); // 3
function fn(){};
var fn = 3;
console.log(fn); // 3
console.log(fn); //ƒ fn(){}
function fn(){};
var fn = 3;
-----
以上代码可改写为:注意变量声明和函数声明都会提升,但值不会提升。
function fn(){};
var fn;
console.log(fn);
fn=3;
//例一
function add1(i){
console.log('a');
}
add1(1);
var add1=function(i){
console.log('b');
}
add1(1);
function add1(i){
console.log('c');
}
add1(1);
// c
// b
// b
提升一下
var add1
function add1(i){
console.log('a');
}
function add1(i){
console.log('c');
}
add1(1);
add1=function(i){
console.log('b');
}
add1(1);
add1(1);
原则:
// c-同名变量 / 同名方法之间比较,后面覆盖前面的
// 两个b-同名变量与同名方法比较,变量赋值前打印的都是函数,变量赋值后打印的都是变量的值
//例二
var add1=function(i){
console.log('a');
}
add1(1);
function add1(i){
console.log('b');
}
add1(1);
function add1(i){
console.log('c');
}
add1(1);
提升一下
var add1
add1=function(i){
console.log('a');
}
function add1(i){
console.log('b');
}
function add1(i){
console.log('c');
}
add1(1); //a
add1(1); //a
add1(1); //a
原则:
同名变量/同名方法,后面覆盖前面的
同名变量对比同名方法,变量赋值前打印的都是函数,变量赋值后打印的都是变量的值
总结:
代码从上往下依次执行,变量声明和函数声明提升后,当在同一个作用域内定义了同名的变量和方法,同名函数之间后面的会覆盖前面的赋值,同名变量赋值会覆盖函数的赋值。注意变量声明和函数声明都会提升,但值不会提升。
js语言中花括号没有块级作用域的概念
立即执行函数表达式可以是匿名函数,可以隔离作用域,方便不用取名字立刻使用
函数声明也是天然隔离作用域,内部声明的变量外部无法调用