众所周知,JavaScript在所有现代浏览器实现中都是单线程的,但是它是在任何标准中指定的还是仅仅是传统的?假设JavaScript始终是单线程的,这是完全安全的吗?
我想知道创建一个具有属性和方法的JavaScript对象的最佳方法是什么.
我已经看到了这个人在所有函数中使用var self = this
然后使用的示例,self.
以确保范围始终正确.
然后我看到了使用.prototype
添加属性的示例,而其他人则使用内联方式.
有人可以给我一个具有一些属性和方法的JavaScript对象的正确示例吗?
我对JavaScript undefined
和null
价值观有点困惑.
什么是if (!testvar)
真正做到?它测试undefined
和null
或只undefined
?
一旦定义了变量,我可以将其清除undefined
(因此删除变量)吗?
我可以undefined
作为参数传递吗?例如:
function test(var1, var2, var3) {
}
test("value1", undefined, "value2");
Run Code Online (Sandbox Code Playgroud) 这是我正在尝试运行的简化版本:
for (var i = 0; i < results.length; i++) {
marker = results[i];
google.maps.event.addListener(marker, 'click', function() {
change_selection(i);
});
}
Run Code Online (Sandbox Code Playgroud)
但我发现每个监听器都使用results.length的值(for循环终止时的值).我如何添加监听器,使得每次使用i时我添加它的值,而不是对i的引用?
javascript closures listener pass-by-reference pass-by-value
我的背景是在C中,我已经选择了PHP,mySQL,HTML,CSS而没有太多问题.
但我发现Javascript/jQuery难以正确使用.很沮丧.为什么?
它似乎违反了许多传统的编程原则(例如可变范围)
未定义的变量似乎无处不在,并且已经存在与它们相关联的值.例如(来自jQuery文档):
$("a").click(function(event) {
event.preventDefault();
$('<div/>')
.append('default ' + event.type + ' prevented')
.appendTo('#log');
});
Run Code Online (Sandbox Code Playgroud)
什么是"事件"?我必须使用此变量名称吗?我应该假设这个对象是用正确的东西神奇地实例化的,我可以使用JQuery API中的任何方法列表吗?
似乎有一堆随机规则(例如,返回false以停止默认操作,但有时这不起作用?)
调试时的非确定性行为.(例如,我刷新浏览器,尝试一些东西并获取结果X用于我在Firebug中观看的JS变量.我再次刷新,我得到结果Y?)
非常混乱的代码很难遵循.什么时候发生?我正在使用Firebug和Chrome开发者工具,但我没有获得足够的可见度.
似乎每天都有一些随机的JS"规则"出现在我的任何JS书籍或教程中我从未见过.
我需要做些什么才能使Javascript/jQuery对我更具确定性,控制性和逻辑性?
有没有资源可以解释Javascript的怪癖/陷阱?
谢谢!
与此问题类似,我想知道有经验的JavaScript开发人员是否有他们使用的任何网站示例,以便在24/28小时内获取JavaScript的基础知识?我看了Douglas Crockford的Google Tech Talk,我买了"Javascript:The Good Parts"这本书,但我没有时间阅读它.
这不是一个笑话的设置,我真的在问.
Douglas Crockford喜欢说在javascript原型面向对象语言中没有必要new
.
他解释说,这new
只是为了让人们从基于类(即" 经典 ")的面向对象编程语言中获得某种程度的安慰:
JavaScript,我们很难
new
雅JavaScript是一种原型语言,但它有一个
new
运算符,试图使它看起来有点像经典语言.这往往会使程序员感到困惑,从而导致一些有问题的编程模式.您永远不需要
new Object()
在JavaScript中使用.请改用对象文字{}
.
好的:
new
坏 {}
好但是后来评论者VítorDeAraújo指出这两者并不相同.他给出了一个例子,表明a string
不像object
:
字符串对象和字符串值不是同一个东西:
Run Code Online (Sandbox Code Playgroud)js> p = "Foo" Foo js> p.weight = 42 42 js> p.weight // Returns undefined js> q = new String("Foo") Foo js> q.weight = 42 42 js> q.weight 42
字符串值不能具有新属性.同样的事情对其他类型也有效.
这里发生了什么string
不是一个object
?我是否混淆了javascript与其他一些语言,其中一切都是对象?
我正在计划关于JavaScript的介绍性演讲,在准备过程中,我想知道新秀陷入的最大陷阱是什么.
我知道在我完全理解闭包之前我已经遇到了一些问题,但JavaScript中的许多奇怪行为都不是我想的了......
那么,你应该向新秀指出哪些陷阱?
我希望有人可以向我解释为什么在浏览器中查看HTML时,下面的JavaScript/HTML会显示"门#2":
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script type="text/javascript">
function testprint() {
alert('door #1');
};
window.onload = testprint;
function testprint() {
alert('door #2');
};
testprint = function() {
alert('door #3');
};
</script>
<script type="text/javascript">
function testprint() {
alert('door #4');
};
</script>
</head>
<body>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
由于只有声明testprint
在window.onload
设置之前发生testprint
,我希望window.onload
原因'门#1'出现.实际上,onload导致'门#2'.请注意,无论是否包含第一个声明,它都会执行此操作testprint
.
第三个和第四个testprint
使用声明使用不同的方式来分配函数,我试着看看它是否会覆盖window.onload
同样的第二个声明的testprint
行为.它没.请注意,如果我将第四个声明移动到第testprint
一个脚本块的末尾,它将被调用window.onload
.
我相信这有一个简单的答案,但是周五下午,我很累.:(
不确定如何解释它,所以我将继续并发布示例代码...
这是一个简单的对象:
var Bob =
{ Stuff : ''
, init : function()
{
this.Stuff = arguments[0]
}
, doSomething : function()
{
console.log( this.Stuff );
}
}
Run Code Online (Sandbox Code Playgroud)
在这里它被使用:
$j = jQuery.noConflict();
$j(document).ready( init );
function init()
{
Bob.init('hello');
Bob.doSomething();
$j('#MyButton').click( Bob.doSomething );
}
Run Code Online (Sandbox Code Playgroud)
一切都有效,除了最后一行.当jQuery调用doSomething方法时,它会覆盖'this'并阻止它工作.
试图使用只是Stuff
不起作用.
那么我如何以允许jQuery调用它的方式引用对象自己的属性,并且还允许对象使用调用jQuery对象?
即我希望能够做到这样的事情:
doSomething : function()
{
console.log( <CurrentObject>.Stuff + $j(<CallerElement>).attr('id') );
}
Run Code Online (Sandbox Code Playgroud)
(在哪里<CurrentObject>
和<CallerElement>
替换为适当的名称.)
javascript ×10
jquery ×2
closures ×1
concurrency ×1
debugging ×1
json ×1
listener ×1
this ×1
undefined ×1