我是javaScript的新手false和0/1。
以下代码,当用户单击切换锚链接时,它似乎没有切换值,并且警报始终给出" true"(我认为应该发生):
document.body.innerHTML = '<a href="#" id="toggle"> toggle </a>'+ document.body.innerHTML;
function f() {
this.status = true;
var btn = document.getElementById("toggle")
btn.addEventListener("click", () => {
if (this.status == true) {
alert(this.status)
this.status = false;
} else {
alert(this.status)
this.status = true;
}
}, false)
}
f()
但是,如果我使用0和1代替/fals/fals,则代码出于某种原因工作。
document.body.innerHTML = '<a href="#" id="toggle"> toggle </a>' +document.body.innerHTML;
function f() {
this.status = 1;
var btn = document.getElementById("toggle")
btn.addEventListener("click",()=>{
if(this.status==1){
alert(this.status)
this.status = 0;
}else{
alert(this.status)
this.status = 1;
}
},false)
}
f()
我不知道这里发生了什么,这是因为我在功能中使用的this
指针吗?
问题是您的函数f
无需new
,因此this
是指window
对象,该对象已经具有具有其自身含义的status
属性。
如果您打印了它的类型:
function f() {
this.status = true;
console.log(typeof this.status);
}
f()
请注意结果是如何为string
而不是预期的boolean
。
但是,如果您以不同的命名:
function f() {
this.myprop = true;
console.log(typeof this.myprop);
}
f()
它产生正确的类型。
为了使它起作用,您只需要更改其名称即可。但是if
else
逻辑您必须将boolean
倒入!
(非),这简化了代码:
document.body.innerHTML = '<a href="#" id="toggle"> toggle </a>' + document.body.innerHTML;
function f() {
this.myStatus = true;
var btn = document.getElementById("toggle");
btn.addEventListener("click", () => {
this.myStatus = !this.myStatus; //here the value is inverted only with the ! (not)
console.log(this.myStatus);
}, false);
}
f();
但是,使用window
对象的原因是您所经历的,并且myStatus
属性仍在那里存储。
您可以改进解决方案:
document.body.innerHTML = '<a href="#" id="toggle"> toggle </a>' + document.body.innerHTML;
function f() {
let myStatus = true;
var btn = document.getElementById("toggle");
btn.addEventListener("click", () => {
myStatus = !myStatus; //here the value is inverted only with the ! (not)
console.log(myStatus);
}, false);
}
f();
另外,不要忘记用半洛龙完成陈述,我注意到你几乎没有。
,由于您是您可能没有听到的JavaScript的新手,但您应该知道何时使用===而不是==(提示:始终)。
,在简而
new Number(10) == 10 // true
new Number(10) === 10 // false
因为:
typeof Number(10) // returns number
typeof 10 // returns number
typeof new Number(10) // returns object
^上面的示例来自https://coderwall.com/p/bqurhg/why-always-use-in-javascript
其他人发布了一些很好的回复,但这是我的两分钱。
您可以在函数中初始化一个本地变量,该变量将初始化一个值,然后在单击按钮时在该值上进行交替。您对this
符号的使用似乎在这里不需要。
document.body.innerHTML = '<a href="#" id="toggle"> toggle </a>'+ document.body.innerHTML;
function f() {
var status = true;
var btn = document.getElementById("toggle")
btn.addEventListener("click", () => {
if (status === true) {
alert(status)
status = false;
} else {
alert(status)
status = true;
}
}, false);
}
f();
使用此功能时,请始终知道您所指的内容。正如ISAC指出的那样,您的this
转介到文档窗口,这似乎是一个问题。
codepen:
https://codepen.io/foozie3moons/pen/ggrbxz?editors = 0010
document.body.innerHTML = '<a href="#" id="toggle"> toggle </a>'+ document.body.innerHTML;
function f() {
let status = true;
let btn = document.getElementById("toggle");
btn.addEventListener("click", () => {
if (status === true) {
alert(status);
status = false;
} else {
alert(status);
status = true;
}
}, false)
}
f();