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

// undefined  0  1  2

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值