现在写项目,写javascript比写后端代码还多,尤其是原生写法,往往会用到google开发者工具,其中的console.log、console.table等方法使用频度非常高。
一直以来都认为console输出的变量总是上面代码的赋值结果,因为javascript的执行顺序是自上而下。但是这回差点被console误导了。
先说结论:console输出的变量如果是引用类型的,则要注意会受到上下文影响。
简单的说就是console后面的代码如果修改了console输出的引用变量,则console的输出会是后面代码赋值的结果,而不是console上面代码赋值的结果
代码举例:
// 这里先定义引用变量 let opts = { columns: [ {field:'id', title:'ID'}, {field:'name', title:'名称'} ] }; // 这里通过console.log输出到控制台(假设在调试变量) // 但是代码继续往下执行 console.log(opts.columns); // 代码继续执行,中间可能还有很多代码...... // 代码继续执行,这里修改了opts.columns的值 opts.columns.push({});
以上console.log输出的结果如下:
// columns [ {}, // 这是下文代码影响到了上面console.log的输出 {field:'id', title:'ID'}, {field:'name', title:'名称'} ]
虽说下文修改引用变量会改变原变量的值,但是console是不是智能点,输出时就应该是截止到那个点,而不是输出的变量还受到后面代码的影响,所以console的真正输出时机不是即时的,应该是上下文结束后才输出,所以才会受到后面代码的影响。
还没有评论,来说两句吧...