我正在阅读弗里斯比教授的大部分功能编程指南,我遇到了如下所示的代码示例.我不明白为什么每次调用squareNumber时缓存都不会重置为{}.
var memoize = function(f){
var cache = {}; // why is this not reset each time squareNumber is called?
return function() {
var arg_str = JSON.stringify(arguments);
cache[arg_str] = cache[arg_str]|| f.apply(f, arguments);
return cache[arg_str];
};
}
var squareNumber = memoize(function(x){ return x*x; });
squareNumber(4);
//=> 16
squareNumber(4); // returns cache for input 4
//=> 16
squareNumber(5);
//=> 25
squareNumber(5); // returns cache for input 5
//=> 25
Run Code Online (Sandbox Code Playgroud)
我的一个理论是,由于memoize是一个全局变量,因此每次调用缓存变量时都不会重置缓存变量.但我似乎无法找到一个好的解决方案.
假设我有以下课程:
function MyClass(){
this.public = function(){
console.log(private);
};
var private = 10;
}
var test = new MyClass;
test.public(); // logs 10
test.private; // undefined
Run Code Online (Sandbox Code Playgroud)
我想知道是否可以从外部访问私有变量。查看 chrome 的控制台似乎是可能的,因为它显示了它的上下文:
编辑:只是为了澄清:我知道如何正确公开它。只是想确定是否没有一些hacky方式来访问它。
首先,我来自.NET世界,其中有静态类(C#,也称为VB中的模块)和实例类 - 可以实例化的类.
这个问题是关于Javascript的,我正在尝试重新创建我已经知道的模式并创建一个模块/静态类.这是代码:
var MyModule = {
variable1: 0,
variable2: 1,
method1: function() {
//code goes here
},
method2: function() {
//mode code goes here
},
method3: function() {
//and some more just to prove the pattern
}
}
method1(); //error - no such method - ok, good, I expect that
variable1 = 5; //silently assigns a variable inside MyModule to 5 ?
Run Code Online (Sandbox Code Playgroud)
请解释为什么在命名空间内声明的方法不可见,但变量是什么?此外,有没有办法防止这些变量在外部可见MyModule,即使在同一个脚本中?
我正在尝试使用for循环遍历一系列URL并将它们用于ajax调用.在ajax调用之外,i正确地更改值,但是当我尝试从调用内部访问它时,它总是返回2.它正确循环但具有相同的值而不是循环0, 1等.
var i = 0;
for(i = 0; i <= 1; ++i) {
console.log("Value outside of call = " + i);
$.ajax({
url : urls[i],
dataType : 'jsonp',
timeout : 3000,
count : 0,
success : function(data) {
console.log("Value inside of call = " + i);
shotInfo[i] = data;
},
error : function() {
}
})
}
Run Code Online (Sandbox Code Playgroud)
我也试过使用while循环,但它具有相同的效果.
我在这里打破了我的头脑.我有这个简单的代码:
function myFunc()
{
this.a = "aaa";
return {
h: function ()
{
alert(this.a);
}
}
}
var f = new myFunc();
console.log(f.h.apply(f)) //I'm expecting to see here : "aaa" but it says "undefined"
Run Code Online (Sandbox Code Playgroud)
f.h看起来完全像这样:
function ()
{
alert(this.a);
}
Run Code Online (Sandbox Code Playgroud)
所以,我正在尝试将上下文设置为f自身(包含aprop)apply.
但它不起作用.
我错过了什么?
ps还有其他选择.我知道.但为什么我的具体代码不起作用?
我正在使用节点异步,我想将变量传递给它在第二个参数中使用的方法...例如:
async.map(submissions, addScore, function(err, submissions) {
if (submissions) {
return submissions;
}
});
Run Code Online (Sandbox Code Playgroud)
我想通过userId沿addScore,但我不知道如何做到这一点.
addScore是我的方法,我呼吁每次提交,它需要一个userId.
function foo() {
var bar = 'no'
setInterval(function() { console.log(bar); }, 1000);
}
Run Code Online (Sandbox Code Playgroud)
当我执行这段代码时,我得到以下输出:no,所以输出是正确的.但是当我执行下一段代码时,当我将函数bar作为参数传递给该匿名函数时,我不知道为什么输出是undefined
function foo() {
var bar = 'no'
setInterval(function(bar) { console.log(bar); }, 1000);
}
Run Code Online (Sandbox Code Playgroud)
如果我将变量作为参数传递,为什么未定义?如果bar在匿名函数中也有一个变量调用,我知道该变量将被内部函数值重写,但我无法理解这种行为
我只想将new1和new new2函数的值传递给new3函数
function new1(){
var a = 5;
}
function new2(){
var c=6;
}
function new3(){
if(a<c){
dosomething();
}
}
Run Code Online (Sandbox Code Playgroud) 假设我声明了fooready函数中调用的变量.通常,当函数结束时,会删除本地声明的变量吗?
我想在事件监听器中使用这个变量#someid.我试过这个,foo当发生点击事件时,仍然可以访问该变量#someid.
当ready函数结束时,为什么这个变量不会被破坏并且仍然可以访问?声明变量并以这种方式使用它是否安全?我不想全局声明变量,因为我没有.
编辑:这些事件监听器及其变量存储在哪里?
这是我的js:
$(document).ready(function() {
var foo = 0;
//random event listener
$('#someId').on('click', function() { foo++; }); //increment foo
});
Run Code Online (Sandbox Code Playgroud) 我一直在努力理解以下代码:
var add = (function () {
var counter = 0;
return function () {return counter += 1;}
})();
add();
add();
add();
Run Code Online (Sandbox Code Playgroud)
这里add分配了匿名自调用函数的返回值 - 即函数function() { return counter += 1 }.现在第一次add()被调用它1按预期返回.但第二次add()称它返回2.
我的问题是因为counter在函数内定义所以不是每次函数完成执行counter都应该死掉?也就是说,在第一次调用add()1之后将显示.现在我们已经不在那个函数中,所以不应该counter忘记它以前的值并且像automatic变量一样从堆栈中销毁?
javascript ×10
jquery ×2
variables ×2
asynchronous ×1
for-loop ×1
function ×1
lifetime ×1
module ×1
node.js ×1
performance ×1
scope ×1