动态类型,通俗来说相当于“万能类型”,即不需要主动的去声明类型,而是让类型在运行时由赋的值绑定。
但在QML编程中,let和var感觉都作为动态类型被使用着,这俩之间有什么区别呢?
一、作用域
let 的作用域是块作用域,即只在单个{...}中能够访问
Button{
...
onClicked: {
for(let i=0;i<1;i++){
console.log("输出了")
}
for(;i<2;i++){
console.log("i is not defined") //另个块{...}就无法访问了
}
}
}
var 的作用域是函数作用域,即在单个函数里都能生效
Button{
...
onClicked: {
for(var i=0;i<1;i++){
console.log("输出了")
}
for(;i<2;i++){
console.log("还是能输出")
}
}
Component.onCompleted: {
for(;i<3;i++){
console.log("i is not defined") //不同函数就无法访问了
}
}
}
二、重复声明
let 不能在同一作用域内重复声明
Button{
...
onClicked: {
let i=1;
console.log(i)
let i=2;
console.log(i) //报错Identifier i has already been declared
}
}
var 能在同一作用域重复声明,但会有警告,所以也不推荐这么做
Button{
...
onClicked: {
var i=1;
console.log(i)
var i=2;
console.log(i) //正确打印 2
}
}
三、变量提升
let 在定义前被访问会报错
Button{
...
onClicked: {
console.log(i) //报错i is not defined
let i=1;
}
}
var 的声明会被提升至作用域顶部,即可以在定义前被访问,但值是undefined
Button{
...
onClicked: {
console.log(i) //打印 undefined
var i=1;
console.log(i) //打印 1
}
}
其实除了一的作用域,二和三与其说是特性,倒更容易变成“坑”,所以更推荐用let,毕竟作用域更加准确可控,当然了,在QML的属性声明中,只存在万能类型 property var ,不要混淆就行