[英]Javascript hasOwnProperty does not work under Google Chrome
我目前正在一個項目的幫助下進行,並且進展順利,直到發生此事件。
function runCommand(commandString)
{
commands = new Object();
commands.clear = function(){ $('#terminal').html('') }
parameters = commandString.split(" ");
command = parameters.shift();
if( commands.hasOwnProperty(command)){
commands[command](parameters);
}
else
{
$('#terminal').append(command+' command not recognized.'+'<br>');
}
}
幫助我的人完成了此功能,因此我可以運行需要使用的“終端式”瀏覽器。
使用Firefox時效果很好,下面是一個示例:
guest@shell:/$ sudo make me sandwich
sudo command not recognized.
guest@shell:/$ clear
*clears*
guest@shell:/$ clear
但是在谷歌瀏覽器下會發生這種情況:
guest@shell:/$ sudo make me sandwich
sudo command not recognized.
guest@shell:/$ clear
clear command not recognized.
我認為它與“ commands.hasOwnProperty(command)”有關,導致它無法正常工作。
我正在使用JQuery的JavaScript庫來構建網站,並且我需要知道如何解決此問題或替代方法。
我非常懷疑Chrome的hasOwnProperty是否存在任何問題,但是無論哪種情況,我都清理了您的代碼並將hasOwnProperty檢查更改為typeof檢查,該檢查也應該更加健壯:
var runCommand = (function () {
var terminal = $('#terminal');
var commands = {
clear: function () {
terminal.html('');
}
};
return function (commandString) {
var parameters = commandString.split(" ");
var command = parameters.shift();
if (typeof commands[command] === "function") {
commands[command](parameters);
} else {
terminal.append(command + ' command not recognized.<br />');
}
};
}());
...如果您好奇的話,我會將命令對象存儲在一個閉包中,這樣,它只需創建一次即可,而不是每次運行該函數時都會創建/銷毀它。 顯然,這大大加快了速度。
另外,我只對#terminal元素進行一次搜索,然后將其存儲在變量中並使用它。 這也是為了提高性能,因為運行jQuery搜索比存儲結果並重復使用它要昂貴得多。
在Chrome 3.0.195.38中為我工作。
我從未聽說過Chrome中hasOwnProperty
有任何問題。 我懷疑您的問題出在其他地方。 完整的測試用例? 您如何閱讀其中的命令? 您是否可能在Chrome中使用領先的空格獲取命令?
您應該記得將函數( commands
, parameters
等)中的局部變量聲明為var
,否則會出現意外的全局變量,這可能會產生奇數且難以調試的錯誤,盡管我懷疑這是問題所在。
我敢打賭,問題在於Firefox和Chrome之間“拆分”的工作方式存在差異。我將嘗試更改獲取參數和命令的方式:
var command = commandString, parameters = [];
if (/ /.test(command)) {
parameters = command.split(' ');
command = parameters[0];
parameters = parameters.slice(1);
}
編輯應該沒有什么區別的第二個想法; 據我所知,Safari應該能夠處理簡單的“在空間上分割”的事情。 確保在該代碼周圍添加了一些調試功能,以在函數認為無法在對象中找到“清除”時查看“命令”是什么。 就像@bobince所說的那樣, 用var
!!!! 定義變量 !
現在在DOM Object實例上使用hasOwnProperty將返回false
function runCommand(commandString) {
var terminal = $('#terminal'), //cached to reduce calls to jQuery
commands = { //start object literal, continue var statement
clear: function (){
terminal.html('');
}
},
parameters = commandString.split(' '),
command = parameters.shift(); //end var statement
if (commands.hasOwnProperty(command)) {
commands[command].call(parameters);
console.log(command + ' command sent.'); //output for testing
} else {
terminal.append(command + ' command not recognized.<br>');
console.warn(command + ' command not recognized.'); //output for testing
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.