JavaScript 显示逻辑运算的错误结果
JavaScript showing wrong result for logical Operation
我有一个 chrome 分机。它的代码有一个方法 getSelectionFromPage()
可以捕获网页上选择的文本,并且总是 returns true
如下所示:
function getSelectionFromPage() {
window.selected = true;
chrome.tabs.executeScript({
code: "window.getSelection().toString();"
}, function(selection) {
if (selection[0] != '') {
window.selected = true;
}else{
window.selected = false;
}
});
return true
}
在相同的 window 上下文中,我 运行 在控制台上执行以下命令。
可以看到结果如下:
我在这里也写同样的命令:
getSelectionFromPage() //-> true
window.selected //-> false
(getSelectionFromPage() && window.selected) //-> true
(getSelectionFromPage() && window.selected)
应该是 false
。我试过检查 typeof(window.selected)
和 typeof(getSelectionFromPage())
,两者都返回 boolean
。我不明白为什么会这样。
设置为false的函数是一个回调函数。在当前执行上下文完成之前,这不会执行。因此,在&& window.selection
执行完成后才会设置为false。
executeScript 文档:https://developer.chrome.com/extensions/tabs#method-executeScript
事情的顺序是:
(function () {
window.selected = true; // Runs
chrome.tabs.executeScript({code: "window.getSelection().toString();"}, function(){
window.selected = false;
}); // Calls browser API and set's callback (the anonymous function there) to call later)
// NOTE: the callback function which was set here was NOT executed yet it was only defined.
return true;
})() // true
&& window.selected // this is currently true
// Later, now callback executes
如果您想等待,可以改用 Promise
。
function getSelectionFromPage() {
return new Promise(function (resolve) {
chrome.tabs.executeScript(
{code: "window.getSelection().toString();"},
// or just put resolve here instead of defining a function to get value directly
function(v){
resolve(!!v);
}
);
});
}
getSelectionFromPage().then(haveSelection => console.log(haveSelection);
我有一个 chrome 分机。它的代码有一个方法 getSelectionFromPage()
可以捕获网页上选择的文本,并且总是 returns true
如下所示:
function getSelectionFromPage() {
window.selected = true;
chrome.tabs.executeScript({
code: "window.getSelection().toString();"
}, function(selection) {
if (selection[0] != '') {
window.selected = true;
}else{
window.selected = false;
}
});
return true
}
在相同的 window 上下文中,我 运行 在控制台上执行以下命令。
可以看到结果如下:
我在这里也写同样的命令:
getSelectionFromPage() //-> true
window.selected //-> false
(getSelectionFromPage() && window.selected) //-> true
(getSelectionFromPage() && window.selected)
应该是 false
。我试过检查 typeof(window.selected)
和 typeof(getSelectionFromPage())
,两者都返回 boolean
。我不明白为什么会这样。
设置为false的函数是一个回调函数。在当前执行上下文完成之前,这不会执行。因此,在&& window.selection
执行完成后才会设置为false。
executeScript 文档:https://developer.chrome.com/extensions/tabs#method-executeScript
事情的顺序是:
(function () {
window.selected = true; // Runs
chrome.tabs.executeScript({code: "window.getSelection().toString();"}, function(){
window.selected = false;
}); // Calls browser API and set's callback (the anonymous function there) to call later)
// NOTE: the callback function which was set here was NOT executed yet it was only defined.
return true;
})() // true
&& window.selected // this is currently true
// Later, now callback executes
如果您想等待,可以改用 Promise
。
function getSelectionFromPage() {
return new Promise(function (resolve) {
chrome.tabs.executeScript(
{code: "window.getSelection().toString();"},
// or just put resolve here instead of defining a function to get value directly
function(v){
resolve(!!v);
}
);
});
}
getSelectionFromPage().then(haveSelection => console.log(haveSelection);