JavaScript 那些容易误解的代码

1、

function test(m) {
    // 函数的参数按值传递
    // m -> {k: 30}
    m = {v: 5};  // m 重写了, 不再跟外层的var m指向同一个地址
    // m -> {v: 5}
}

var m = {k:30};
test(m);
alert(m.v);  // undefined  m -> {k:30}

2、

var m1 = {v: 5};
var m2 = m1;
m2 = { s:8, k: 9};  // m2重写了,不再跟m1指向同一个地址
console.log(m1);    // {v: 5}
console.log(m2);    //{ s:8, k: 9}

3、

function test(m) {
    // 函数的参数按值传递
    // m -> {k: 30}
    m.q = 6;
    // m -> {k: 30, q: 6}
}

var m = {k:30};
test(m);
alert(m.q);  //6

4、

if(!("userName" in window)) {
    var userName = "Tom";
}

console.log(userName);  // undefined

// 变量提升,变量存在,不执行if内的语句

5、函数的形参与函数内部声明的变量重名

// 函数内部声明的变量未赋值
function ab(x){ 
    console.log(x);  // 3
    var x;  
    console.log(x);  // 3
}; 
ab(3);
// 函数内部声明的变量被赋值,会顶替传进来的参数
function ab(x){ 
    console.log(x);  // 3
   var x = 4;
    console.log(x);  // 4
}; 
ab(3);  

6、函数的形参与函数内部声明的函数重名

function ab(x){ 
  console.log(x);  // 函数体x
  function x(){
    console.log("我是函数")
  }; 
  console.log(x);  // 函数体x
}; 
ab(3);
function ab(x){ 
  console.log(x);  // 3
  var x = function(){
    console.log("我是函数")
  }; 
  console.log(x);  // 函数体x
}; 
ab(3);

7、

var name = 'global';
// 参数就是一个变量声明
function A(name) {
    alert(name);  // 3
    this.name = name;
    var name = 1;
}

A.prototype.name = '2';
var a = new A('3');
alert(a.name);  // 3
delete a.name;
alert(a.name);  // 2

8、

function fun(n, o) {
    console.log(o);
    return {
        fun: function(m) {
            return fun(m,n);
        }
    }
}

var a = fun(0);
a.fun(1); 
a.fun(2);
var b = fun(0).fun(1).fun(2).fun(3);
var c = fun(0).fun(1);
c.fun(2).fun(3);

// undefined  0  0 

// undefined  0  1  2  3

// undefined  0  1  2  3

猜你喜欢

转载自blog.csdn.net/u010238381/article/details/81124213
今日推荐