美文网首页
JS全局变量

JS全局变量

作者: 贪恋冬天的幸福 | 来源:发表于2019-10-27 18:17 被阅读0次

JavaScript的两个特性会出人意料地创建全局变量:

  1. 变量即使未声明也可直接使用
  2. 未经声明的变量,默认为全局对象所有(暗示全局变量 implied globals)

这样一来,之后出现的全局变量,就会污染已出现的同名全局变量,导致不可预料的结果。

未经声明的变量,默认为全局对象所有:

var result = 'this is result in global';
console.log(this.result); //this is result in global
function sum(x, y) {
  result = x + y;
  return result;
}
console.log('sum = ' + sum(1, 3)); //4
console.log(this.result); //4   ** 此处改变了全局变量resule的值 **

使用 var 声明变量:

var result = 'this is result in global';
console.log(this.result); //this is result in global
function sum(x, y) {
  var result = x + y;
  return result;
}
console.log('sum = ' + sum(1, 3)); //4
console.log(this.result); //this is result in global   ** 此处没有改变全局变量resule的值 **

创建隐式全局变量的反模式是带有 var/let 声明的链式赋值。在链式赋值中,只有距离声明变量 var/let 最近的变量是局部变量,其余均为全局变量,例如:

var b = 3;
function add2(x){
  var a = b = 2; //   ** a为局部变量,b为全局变量 **
  return x + a;
}
console.log(this.b); //2   ** 此处改变了全局变量b的值 **
var b = 3;
function add2(x){
  let a = b = 2; //   ** a为局部变量,b为全局变量 **
  return x + a;
}
console.log(this.b); //2   ** 此处改变了全局变量b的值 **

显然链式声明并没有得到预期的结果,这是因为从右至左的操作符优先级。首先,优先级比较高的是表达式b=0,此时b未经声明。表达式的返回值是0,它被赋给var声明的局部变量a,如以下代码所示:

var a = (b = 0);

如果对链式赋值的所有变量都进行了声明,就不会创建出不期望的全局变量。

var b = 3;
function add2(x){
 // ** a 、b 均为局部变量**
  var a, b;
  a = b = 2;
  return x + a;
}
console.log(this.b); //3   ** 此处没有改变全局变量b的值 **
var b = 3;
function add2(x){
  // ** a 、b 均为局部变量**
  let a, b;
  a = b = 2;
  return x + a;
}
console.log(this.b); //3   ** 此处没有改变全局变量b的值 **

所以,尽可能少地使用全局变量,是保证程序执行可预见性的必要手段。

参考资料:《JavaScript 模式》 Stoyan Stefanov 著 陈新 译

相关文章

  • 小程序全局变量

    在app.js里面定义全局变量 在要用到全局变量的某个js文件中

  • uniapp实现全局变量

    1.引入外部js文件引入全局常量-组件引用全局变量 2.main.js入口文件挂载全局变量-this引用全局变量m...

  • VUE 全局变量的几种实现方式

    最近在学习VUE.js 中间涉及到JS全局变量,与其说是VUE的全局变量,不如说是模块化JS开发的全局变量。 1、...

  • 微信小程序全局常量,全局js文件使用

    方法一:app.js 内设置全局变量(如屏宽,屏高的设置) 1、app.js文件 定义全局变量 设置全局变量 a...

  • JS毒瘤

    1. 全局变量 JS中所有的糟糕特性中,最为糟糕的一个就是它对全局变量的依赖。许多编程语言都有全局变量,JS的问题...

  • JS作用域链

    1、JavaScript的全局变量和局部变量 (1) 全局变量 js的全局变量也可以看做window对象的属性。如...

  • js中的作用域链

    1、JavaScript的全局变量和局部变量 首先,先来看看js的全局变量和局部变量,js不是块级作用域,所以不能...

  • Vue全局变量的实现方式

    创建js文件,添加需要使用的全局变量 1、全局变量模块导入方式 2、全局变量挂载到Vue.ptototype中

  • JS 预编译

    JS 运行三部曲 JS 运行三部曲语法分析预编译解析执行 预编译前奏暗示全局变量 imply global全局变量...

  • mpvue 全局变量在HTML模板<template>

    我们在开发项目时,经常用到的就是全局变量,在vue.js项目中,只要在main.js设置好全局变量后,在所有的页面...

网友评论

      本文标题:JS全局变量

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