微信小程序——JS执行顺序和作用域

脚本的执行顺序

浏览器中,脚本严格按照加载的顺序执行,如代码2-29所示。

代码清单2-29 浏览器中的脚本



  
  
  

  
  


以上代码的输出是:

a.js

inline script

b.js

而在小程序中的脚本执行顺序有所不同。小程序的执行的入口文件是 app.js 。并且会根据其中 require 的模块顺序决定文件的运行顺序,代码2-30是一个 app.js 示例。

代码清单2-30 app.js

/* a.js
console.log('a.js')
*/
var a = require('./a.js')
console.log('app.js')

/* b.js
console.log('b.js')
*/
var b = require('./b.js')

以上代码的输出顺序是:

a.js

app.js

b.js

当 app.js 执行结束后,小程序会按照开发者在 app.json 中定义的 pages 的顺序,逐一执行。如代码2-31所示。

代码清单2-31 app.json 文件

{
  "pages": [
    "pages/index/index",
    "pages/log/log",
    "pages/result/result"
  ],
  "window": {}
}

代码清单2-32 app.js文件

// app.js
console.log('app.js')

代码清单2-33 pages/index/index.js 文件

// pages/index/index
console.log('pages/index/index')

代码清单2-34 page/log/log.js 文件

// pages/log/log
console.log('pages/log/log')

代码清单2-35 page/result/result.js 文件

// pages/result/result
console.log('pages/result/result')

以上文件执行后输出的结果如下:

app.js

pages/index/index

pages/log/log

pages/result/result

作用域

同浏览器中运行的脚本文件有所不同,小程序的脚本的作用域同 NodeJS 更为相似。

在文件中声明的变量和函数只在该文件中有效,不同的文件中可以声明相同名字的变量和函数,不会互相影响,如代码2-36、代码2-37所示。

代码清单2-36 在脚本 a.js 中定义局部变量

// a.js
// 定义局部变量
var localValue = 'a'

代码清单2-37 在脚本 b.js 中无法访问 a.js 定义的变量

// b.js
// 定义局部变量
console.log(localValue) // 触发一个错误 b.js中无法访问 a.js 中定义的变量

当需要使用全局变量的时,通过使用全局函数 getApp() 获取全局的实例,并设置相关属性值,来达到设置全局变量的目的,如代码2-38、代码2-39所示。

代码清单2-38 在脚本 a.js 中设置全局变量

// a.js
// 获取全局变量
var global = getApp()
global.globalValue = 'globalValue'

代码清单2-39 在脚本 b.js 中访问 a.js 定义的全局变量

// b.js
// 访问全局变量
var global = getApp()
console.log(global.globalValue) // 输出 globalValue

需要注意的是,上述示例只有在 a.js 比 b.js 先执行才有效,当需要保证全局的数据可以在任何文件中安全的被使用到,那么可以在 App() 中进行设置,如代码2-40、代码2-41、代码2-42所示。

代码清单2-40 定义全局变量

// app.js
App({
  globalData: 1
})

代码清单2-41 获取以及修改 global 变量的方法

// a.js
// 局部变量
var localValue = 'a'

// 获取 global 变量
var app = getApp()

// 修改 global 变量
app.globalData++  // 执行后 globalData 数值为 2

代码清单2-42 获取 global 变量

// b.js
// 定义另外的局部变量,并不会影响 a.js 中文件变量
var localValue = 'b'

// 如果先执行了 a.js 这里的输出应该是 2
console.log(getApp().globalData)

你可能感兴趣的:(微信小程序——JS执行顺序和作用域)