JS中容易出错的点

作者: _Dot912 | 来源:发表于2017-11-01 16:15 被阅读0次

基本类型和引用类型的赋值问题

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("函数声明:"+(i+1));
}
add1(1);

var add1=function(i){
console.log("函数声明:"+(i+10));
}
add1(1);

function add1(i){
console.log("函数声明:"+(i+100));
}
add1(1);

//函数声明:101 
//函数声明:11 
//函数声明:11 

例一中:

  • 函数从上往下依次读取代码,首先调用第一个add1(1),同名函数后面覆盖前面的,所以调用第一个add1(1)实际上读取的是后一个add(i)函数的值,即返回"函数声明:101"
  • 代码接着往下执行,读到变量add1,调用第二个add1(1),执行变量add1后函数体中的代码,打印结果为"函数声明:11"
  • 接着读到第二个add1函数,因变量add1与函数add1在同一作用域下,所以变量add1的值会覆盖函数add1的值,所以第三个打印结果为"函数声明:11"
//例二
var add1=function(i){
console.log("函数声明:"+(i+10));
}
add1(1);

function add1(i){
console.log("函数声明:"+(i+1));
}
add1(1);

function add1(i){
console.log("函数声明:"+(i+100));
}
add1(1);
//函数声明:11
//函数声明:11
//函数声明:11

例二中:

  • 函数从上往下依次读取代码,首先调用第一个add1(1),执行变量add1后函数题中的代码,打印结果为函数声明:11,
  • 代码接着往下执行,读到函数add1,调用第二个add1(1),因变量add1与函数add1在同一作用域下,所以变量add1的值会覆盖函数add1的值,所以第二个打印结果为函数声明:11
  • 代码接着往下执行,读到函数add1,调用第三个add1(1),因变量add1与函数add1在同一作用域下,所以变量add1的值会覆盖函数add1的值,所以第三个打印结果为函数声明:11
//例三
function add1(i){
console.log("函数声明:"+(i+1));
}
add1(1);

function add1(i){
console.log("函数声明:"+(i+100));
}
add1(1);

var add1=function(i){
console.log("函数声明:"+(i+10));
}
add1(1);
//101
//101
//11

例三中:

  • 函数从上往下依次读取代码,首先调用第一个add1(1),同名函数后面覆盖前面的,所以调用第一个add1(1)实际上读取的第二个add(i)函数的值,即返回函数声明:101,
  • 接着调用第二个add1(1),执行函数体代码得到打印值:函数声明:101
  • 代码接着往下执行,读到变量add1,调用第三个add1(1),执行变量add1后函数题中的代码,打印结果为函数声明:11

总结:
代码从上往下依次执行,当在同一个作用域内定义了同名的变量和方法,同名函数之间后面的会覆盖前面的赋值,同名变量赋值会覆盖函数的赋值。注意变量声明和函数声明都会提升,但值不会提升。

  1. js语言中花括号没有块级作用域的概念

  2. 立即执行函数表达式可以是匿名函数,可以隔离作用域,方便不用取名字立刻使用
    函数声明也是天然隔离作用域,内部声明的变量外部无法调用

相关文章

  • JS中容易出错的点

    基本类型和引用类型的赋值问题 上例很好地证明了:基本类型值按值传递,引用类型值按引用传递 同名变量和方法覆盖问题 ...

  • Typescript

    js:弱类型语言,动态类型,容易出错,维护成本较高ts: 微软创建的,以js为基础构建的语言。 js的超集,引入类...

  • 带你理解 JS 容易出错的坑和细节(本篇博客转载自掘金,作者夕阳

    本文原载于掘金**,作者夕阳**(饥人谷学员),转载已获作者授权。 本文重在列出并解释说明 JS 中各种容易出错的...

  • 一些开发中的不常见JS细节

    最近在开发中遇到一些js小细节,很容易出错,应该是以前学习js时没有系统性,完整性学习JavaScript带来的弊...

  • 讯飞语音集成

    容易出错的地方: 1、startSpeech方法中 show方法容易出错 错误提示java.lang.NullPo...

  • JS 容易出错的坑和细节

    执行环境(Execution context) var 和 let 的正确解释 当执行 JS 代码时,会生成执行环...

  • 【python语法细节】容易出错的点

    leetcode 22 错误写法,把 subStr += '(' 当作参数放进去 正确写法√√√:把 oneStr...

  • 2018/7/18

    日精进。 今日体验做事要有耐心。 没有耐心急急忙忙的容易出错, 小心点做事不出错

  • 靠自己才是做好工作的法宝

    很多初入职场的朋友,往往因为经验不足,工作中特别容易出错,这时候千万不要害怕出错,出错了就要多多总结工作出错的原因...

  • CocosCreator模拟器报错:Simulator: 148

    Simulator后面的那个就是出错的行数,出错的文件是\library\bundle.project.js 去找...

网友评论

    本文标题:JS中容易出错的点

    本文链接:https://www.haomeiwen.com/subject/gqlgpxtx.html