Qt QML中JS代码块声明 动态类型变量 是用 let 还是 var ?

动态类型,通俗来说相当于“万能类型”,即不需要主动的去声明类型,而是让类型在运行时由赋的值绑定。

但在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 ,不要混淆就行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值