相关疑难解决方法(0)

这两个功能的区别?("function x"vs"var x = function")

可能重复:
JavaScript:var functionName = function(){} vs function functionName(){}

有什么区别:

function sum(x, y) {
  return x+y;
}

// and 

var sum = function (x, y) {
    return x+y;
}
Run Code Online (Sandbox Code Playgroud)

为什么一个用于另一个?

javascript

51
推荐指数
3
解决办法
1万
查看次数

我的javascript范围有什么问题?

2每次都会发出以下警报.

function timer() {
    for (var i = 0; i < 3; ++i) {
        var j = i;
        setTimeout(function () {
            alert(j);
        }, 1000);
    }
}

timer();
Run Code Online (Sandbox Code Playgroud)

不应该var j = i;设置j进入setTimeout的个别范围?

如果我这样做:

function timer() {
    for (var i = 0; i < 3; ++i) {
        (function (j) {
            setTimeout(function () {
                alert(j);
            }, 1000);
        })(i);
    }
}

timer();
Run Code Online (Sandbox Code Playgroud)

它提醒0,1,2像它应该.

有什么我想念的吗?

javascript closures scope

50
推荐指数
2
解决办法
1079
查看次数

以这种方式将参数传递给匿名函数的目的是什么?

可能重复:
JavaScript闭包如何工作?

我正在玩Google Closure Compiler,输入随机代码来查看它会做什么.

它重写了我的一个函数,看起来像这样:

(function(msg) { console.log(msg); })("Hello World!");???????
Run Code Online (Sandbox Code Playgroud)

看来它"Hello World"是传递msg给它之前的匿名函数的参数.我看了一会儿,并且认为我在jQuery插件中看到类似的东西:

(function( $ ) {
  ...
})(jQuery); 
Run Code Online (Sandbox Code Playgroud)

在与冲突的范围内,现在对我来说更有意义$.但是将参数传递给这样的匿名函数的主要原因或目的是什么?为什么不简单地将参数定义为函数中的变量?编写这样的函数是否有任何性能或灵活性优势?

javascript jquery google-closure-compiler

48
推荐指数
1
解决办法
1227
查看次数

与语言X闭包相比,Python中的闭包有哪些限制?

X是任何支持某种闭包风格的编程语言(C#,Javascript,Lisp,Perl,Ruby,Scheme等).

Python中的Closures中提到了一些限制(与Ruby的闭包相比),但文章很旧,现代Python中不再存在许多限制.

查看具体限制的代码示例会很棒.

相关问题:

python closures

47
推荐指数
4
解决办法
7942
查看次数

我的JavaScript模式/实践很糟糕.我应该在哪里寻求帮助?

在过去的几年里,我几乎专注于后端任务,我刚刚注意到,在我缺席的情况下,大多数JavaScript(和CoffeeScript)项目都变得更加漂亮.

我主要在rails环境中工作,几乎所有的JavaScript/jQuery都看起来像这样:

$(an_element).an_event(function() {
  stuff_i_want_to_do;
})

$(another_element).some_other_event(function() {
  some_other_stuff_i_want_to_do;
})
Run Code Online (Sandbox Code Playgroud)

抛开回调,这几乎就是它.

无论如何,只是浏览一些其他人的代码,并注意到许多javascripters在我不在的时候变得更漂亮.这并不复杂,但它是我所见过的更新/更好的JavaScript方法的典型:

jQuery -> 
  if $('#products').length
    new ProductsPager()

class ProductsPager
  constructor: (@page = 1) ->
    $(window).scroll(@check)

  check: =>
    if @nearBottom()
      @page++
      $(window).unbind('scroll', @check)
      $.getJSON($('#products').data('json-url'), page: @page, @render)
#

  nearBottom: =>
    $(window).scrollTop() > $(document).height() - $(window).height() - 50

  render: (products) =>
    for product in products
      $('#products').append Mustache.to_html($('#product_template').html(), product)
    $(window).scroll(@check) if products.length > 0
Run Code Online (Sandbox Code Playgroud)

我一直在寻找有关JavaScript(和/或CoffeeScript)的现代最佳实践/模式的资源,但我没有太多运气.所以简而言之,我应该在哪里加快速度:最好的javascript/coffeescript现代模式和实践?

javascript jquery ruby-on-rails coffeescript

47
推荐指数
2
解决办法
3941
查看次数

这些多余的花括号的目的是什么?

所以我最近开始在一个新的工作场所,我遇到了一种javascript格式,让我质疑它的目的.(特别是括号{})

var _occurrences = getOccurrences($('#ddlTours').val());
{
    var _occurrence = getObjectByValue(_occurrences, 'tourID', booking.tourID);
    {
        _occurrenceID = _occurrence.occurrenceID;
    }
}
Run Code Online (Sandbox Code Playgroud)

对我来说,它几乎看起来像一个尝试对象的构造.即

var _occurrences : // Ignoring = getOccurrences($('#ddlTours').val());
{
    _occurrence : // Ignoring getObjectByValue(_occurrences, 'tourID', booking.tourID);
    {
        _occurrenceID : _occurrence.occurrenceID;
    }
}
Run Code Online (Sandbox Code Playgroud)

但据我所知,它会执行它.

var _occurrences = getOccurrences($('#ddlTours').val());
var _occurrence = getObjectByValue(_occurrences, 'tourID', booking.tourID);
_occurrenceID = _occurrence.occurrenceID;
Run Code Online (Sandbox Code Playgroud)

或者它是如此_occurrence得到删除并且不会被封装,我们分配一个在封装之外的var.这实际上是否可以改善绩效?即

Global var a = 1
{
    b = someFunction()  // After execution because of encapsulation it poofs???
    for(var c in b)
    {
        a += c.somefunction() …
Run Code Online (Sandbox Code Playgroud)

javascript

46
推荐指数
3
解决办法
2836
查看次数

每个对象都是一个函数,每个函数都是对象 - 哪个是正确的?

我正在读这个链接JavaScript_syntax

这似乎是循环的 - 每个函数都是一个Object,每个Object本身都是一个函数.哪个是原子的?有人能以更好的方式解释吗?

javascript

45
推荐指数
4
解决办法
2万
查看次数

Javascript:在For循环中创建函数

最近,我发现自己需要创建一系列函数.这些函数使用XML文档中的值,我使用for循环运行相应的节点.但是,在执行此操作时,我发现只有XML表的最后一个节点(对应于for循环的最后一次运行)才被数组中的所有函数使用.

以下是展示此内容的示例:

var numArr = [];
var funArr = [];
for(var i = 0; i < 10; ++i){
    numArr[numArr.length] = i;
    funArr[funArr.length] = function(){  return i; };
}

window.alert("Num: " + numArr[5] + "\nFun: " + funArr[5]());
Run Code Online (Sandbox Code Playgroud)

输出为Num:5和Fun:10.

经过研究,我找到了一段有效的代码,但我很难理解为什么它有效.我用这个例子在这里复制了它:

var funArr2 = [];
for(var i = 0; i < 10; ++i)
    funArr2[funArr2.length] = (function(i){ return function(){ return i;}})(i);

window.alert("Fun 2: " + funArr2[5]());
Run Code Online (Sandbox Code Playgroud)

我知道它与范围界定有关,但乍一看似乎它与我的天真方法没有任何不同.我有点像Javascript的初学者,所以如果我可能会问,为什么使用这个函数返回函数技术会绕过作用域问题?另外,为什么(i)包括在最后?

非常感谢你提前.

javascript function

40
推荐指数
3
解决办法
3万
查看次数

JavaScript无限循环?

如何在JavaScript中创建无限循环?我正在尝试制作幻灯片,我已经开始工作了,但我无法让它循环播放.我甚至无法让它循环两次.

我现在使用的代码是

window.onload = function start() {
    slide();
}
function slide() {
    var num = 0;
    for (num=0;num<=10;num++) {
        setTimeout("document.getElementById('container').style.marginLeft='-600px'",3000);
        setTimeout("document.getElementById('container').style.marginLeft='-1200px'",6000);
        setTimeout("document.getElementById('container').style.marginLeft='-1800px'",9000);
        setTimeout("document.getElementById('container').style.marginLeft='0px'",12000);
    }
}
Run Code Online (Sandbox Code Playgroud)

没有那里的东西,它确实经历了一次.当我输入一个for时,它要么让Firefox锁定,要么只循环一次.我确信这是一件非常简单的事情,即使它必须循环1,000,000次而不是无限次,这对我来说还算合适.

另外,我不想使用jQuery或其他人创建的东西.我正在学习JavaScript,这部分是为了帮助我学习,部分是因为我正在努力制作尽可能多的基于HTML5的系统.

编辑:我认为它冻结的原因是因为它一次执行代码,然后只是将它存储在缓存或其他东西.我想要它做的就是经历一次,然后再次从顶部开始,这是我一直认为循环的地方.在"批处理"(命令提示符)脚本中,可以使用" GOTO"命令完成.我不知道JS中是否有相同的东西,但这确实是我的目标.

javascript loops

39
推荐指数
3
解决办法
12万
查看次数

没有办法在javascript中拥有基于类的对象?

基于javascript原型的面向对象编程风格很有趣,但是在很多情况下你需要能够从类创建对象.

例如,在矢量绘图应用程序中,工作空间通常在绘图开始时为空:我无法从现有工作空间创建新的"行".更一般地说,动态创建对象的每种情况都需要使用类.

我已经阅读了很多教程和书"Javascript:好的部分",但在我看来,没有办法定义尊重1)封装的类和2)有效的成员方法声明(我的意思是:成员)正在定义的方法,并在每个类实例之间共享).

要定义私有变量,正在使用闭包:

function ClassA()
{
    var value = 1;
    this.getValue = function()
    {
        return value;
    }
}
Run Code Online (Sandbox Code Playgroud)

这里的问题是"ClassA"的每个实例都有自己的成员函数"getValue"的副本,这是无效的.

要有效地定义成员函数,正在使用原型:

function ClassB()
{
    this.value = 1;
}

ClassB.prototype.getValue = function()
{
    return this.value;
}
Run Code Online (Sandbox Code Playgroud)

这里的问题是成员变量"value"是公共的.

我不认为这个问题可以轻易解决,因为在创建对象期间需要定义"私有"变量(以便对象可以访问其创建的上下文,而不暴露those值)而基于原型的成员函数定义必须在对象创建后完成,因此原型有意义("this.prototype"不存在,我已经检查过).

或者我错过了什么?


编辑:

首先,感谢您的有趣答案.

我只想为我的初始消息添加一点精度:

我真正想做的是拥有1)私有变量(封装是好的,因为人们只能访问他们需要的东西)和2)有效的成员方法声明(避免拷贝).

似乎简单的私有变量声明只能通过javascript中的闭包来实现,这就是为什么我专注于基于类的方法.如果有一种方法可以用基于原型的方法实现简单的私有变量声明,那对我来说没问题,我不是一个激烈的基于类的方法proponnent.

在阅读答案后,似乎简单的解决方案是忘记私有,并使用特殊的编码约定来阻止其他程序员直接访问"私有"变量...

我同意,我的标题/第一句话对于我想在这里讨论的问题有误导性.

javascript oop private class

38
推荐指数
3
解决办法
3868
查看次数