小编sac*_*eie的帖子

绑定到事件时,Javascript闭包的行为会有所不同

我试图使用闭包来确保函数只能执行一次.听起来很简单,它的工作原理如下:

function runOnce(fn)  // returns copy of fn which can only execute once
{
    var ran = false;

    return function() 
    {
        if (!ran)
        {
            fn();
            ran = true;
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

我已经测试了这个函数:

function lazyLoadGrid(event, ui)
{
    alert('hi');
}

var test1 = runOnce(lazyLoadGrid);
var test2 = runOnce(lazyLoadGrid);

test1();
test2();

test1();
test2();
Run Code Online (Sandbox Code Playgroud)

并且它按预期工作 - 'hi'被提醒两次.

但后来我尝试使用runOnce(lazyLoadGrid)作为jQuery UI事件的回调:

$('.accordion').each(function() 
{ 
    $(this).accordion({ autoHeight: false, change: runOnce(lazyLoadGrid) });
});
Run Code Online (Sandbox Code Playgroud)

疯狂随之而来.我期待的是,当首次打开手风琴时,页面上的每个'手风琴'都会运行一次lazyLoadGrid().相反,闭包回调似乎表现得好像它们都引用了'ran'的相同副本.lazyLoadGrid()在我第一次打开任何手风琴时运行,然后再也不会为任何其他手风琴再次运行.记录'ran'的前置条件值表示每次在第一个之后点击任何手风琴时它都是'true'.

对此有何解释?值得注意的是,我有一个奇怪的页面,嵌套的手风琴,以及多个包含手风琴的jQuery UI标签.更糟糕的是,当我切换标签时,闭合实际上确实在任何给定标签的第一个打开的手风琴上运行.任何建议都非常感谢.

javascript jquery closures jquery-ui

12
推荐指数
1
解决办法
216
查看次数

Repa 2和3 API之间的主要区别是什么?

更具体地说,我有以下看似无害的小修复3程序:

{-# LANGUAGE QuasiQuotes #-}

import Prelude hiding (map, zipWith)
import System.Environment (getArgs)
import Data.Word (Word8)
import Data.Array.Repa
import Data.Array.Repa.IO.DevIL
import Data.Array.Repa.Stencil
import Data.Array.Repa.Stencil.Dim2

main = do
  [s] <- getArgs
  img <- runIL $ readImage s

  let out = output x where RGB x = img
  runIL . writeImage "out.bmp" . Grey =<< computeP out

output img = map cast . blur . blur $ blur grey
  where
    grey              = traverse img to2D luminance
    cast n            = floor n :: …
Run Code Online (Sandbox Code Playgroud)

parallel-processing haskell image-processing repa data-parallel-haskell

11
推荐指数
2
解决办法
772
查看次数

Selenium 可以在 Android 设备上直接运行(没有 adb)吗?

我正在为 Android 编写一个 Web 测试自动化应用程序,想知道是否有办法直接在 Android 设备上运行 chromedriver (Selenium)(或将它与我的应用程序捆绑在一起)。我意识到正常的方法是在 PC 上运行 chromedriver 并使用 adb 连接到 Android 设备。但我希望我的用户不必安装 Android SDK,即使没有 PC 可用,也能够在本机设备上运行测试。

有谁知道这样做的方法?如果没有 - 是否可以在 Android 应用程序中实现 WebDriver 协议?是否有任何开源项目已经尝试这样做?

selenium android automated-tests android-ndk selenium-chromedriver

7
推荐指数
1
解决办法
2738
查看次数

什么时候能减少改变功能的类型?

以下究竟发生了什么?

> let test = map show

> :t test
test :: [()] -> [String]

> :t (map show)
(map show) :: Show a => [a] -> [String]
Run Code Online (Sandbox Code Playgroud)

我想知道我以前怎么没注意到这个?我实际上遇到了"map fromIntegral"而不是show的问题 - 我的代码不能用无点的形式进行编译,但是在没有eta减少的情况下工作正常.

有关eta减少何时可以改变Haskell代码含义的简单解释?

haskell typeclass pointfree

6
推荐指数
1
解决办法
343
查看次数

如何用256位AVX向量平方两个复数双精度?

Matt Scarpino给出了一个很好的解释(虽然他承认他不确定这是最佳算法,但我感谢他),感谢他如何将两个复杂的双倍乘以英特尔的AVX内在函数.这是他的方法,我已经验证了:

__m256d vec1 = _mm256_setr_pd(4.0, 5.0, 13.0, 6.0);
__m256d vec2 = _mm256_setr_pd(9.0, 3.0, 6.0, 7.0);
__m256d neg  = _mm256_setr_pd(1.0, -1.0, 1.0, -1.0);

/* Step 1: Multiply vec1 and vec2 */
__m256d vec3 = _mm256_mul_pd(vec1, vec2);

/* Step 2: Switch the real and imaginary elements of vec2 */
vec2 = _mm256_permute_pd(vec2, 0x5);

/* Step 3: Negate the imaginary elements of vec2 */
vec2 = _mm256_mul_pd(vec2, neg);  

/* Step 4: Multiply vec1 and the modified vec2 */
__m256d vec4 = …
Run Code Online (Sandbox Code Playgroud)

c simd intrinsics avx complex-numbers

5
推荐指数
2
解决办法
1652
查看次数

如何从SSE2 __m128i结构中提取字节?

我是SIMD内在函数的初学者,所以我会提前感谢大家的耐心等待.我有一个涉及无符号字节的绝对差异比较的应用程序(我正在使用灰度图像).

我尝试了AVX,更现代的SSE版本等,但最终决定SSE2似乎已经足够并且对个别字节的支持最多 - 如果我错了,请纠正我.

我有两个问题:第一,加载128位寄存器的正确方法是什么?我想我应该将加载的内在数据传递到128的倍数,但这样可以使用2D数组代码:

greys = aligned_alloc(16, xres * sizeof(int8_t*));

for (uint32_t x = 0; x < xres; x++)
{
    greys[x] = aligned_alloc(16, yres * sizeof(int8_t*));
}
Run Code Online (Sandbox Code Playgroud)

(上面的代码假设xres和yres是相同的,并且是2的幂).这会在内存中变成线性的,不间断的块吗?那么,当我循环时,我可以继续将地址(递增128)传递给SSE2加载内在函数吗?或者像这样的2D阵列需要做些什么?

我的第二个问题:一旦我完成了所有的矢量处理,我该如何从中提取修改后的字节__m128i?通过英特尔内在指南,将矢量类型转换为标量类型的指令很少见.我发现的最接近的是int,_mm_movemask_epi8 (__m128i a)但我不太明白如何使用它.

哦,还有三分之一的问题 - 我假设_mm_load_si128只加载了带符号的字节?而且我找不到任何其他字节加载函数,所以我猜你应该从每个中减去128并稍后解释它?

我知道这些是SIMD专家的基本问题,但我希望这对像我这样的初学者有用.如果你认为我对应用程序的整个方法是错误的,或者我会更好地使用更现代的SIMD扩展,我很想知道.我只是想谦虚地警告我从未使用过装配,所有这些有点蠢蠢欲动的东西需要大量的解释才能帮助我.

不过,我很感激任何澄清.

如果它有所不同:我的目标是低功耗的i7 Skylake架构.但是,将应用程序运行在更旧的机器上也是很好的(因此SSE2).

c image-processing simd vectorization sse2

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

`pixel(*copy)[rows] = malloc(cols*sizeof(*copy))需要多少次调用free()?

我已经看到了在C99中使用以下表达式分配2D数组的各种建议:

int (*array)[cols] = malloc(rows * sizeof *array);
Run Code Online (Sandbox Code Playgroud)

我想知道三件事:

  1. 整个结构是否在堆上分配?或者这实际上是一堆指针(在堆栈上)指向堆上的数组..?

  2. 分配的内存是否完全连续?

  3. 是否只需要一次调用free(array)来释放整个2D结构?我在某个地方读过这个 - 不记得在哪里 - 它似乎对我有用,但我想明白为什么.

c arrays malloc free c99

2
推荐指数
1
解决办法
131
查看次数