假设有一个功能def f = { x -> x + 4 }.
有没有办法以某种方式称它为7.f()和得到11?
作为一个相当新的Javascript和ac#背景我一直在磕磕绊绊.我很快就知道,我需要了解函数本身就是对象这一事实,而且JS闭包通常是导致混淆的原因.
我试图理解这段代码
// Function which returns object with function properties
function myFunc() {
value = 42;
var result = {
value: value,
getValue: getValue,
incrementValue: incrementValue,
setValue: setValue,
};
return result;
function setValue(y) {
value = y;
};
function getValue() {
return value;
};
function incrementValue() {
value++;
};
};
// Helper function to print out results
function printResults(m,x){
$('#output').append(m + ': ' + x).append('<br/>');
};
var myObject = myFunc(); // returns the object
printResults('Inital call to getValue',myObject.getValue());
myObject.setValue(59);
printResults('Called …Run Code Online (Sandbox Code Playgroud) 我可以这样调用这个闭包:
var increment = (function () {
var test = 0;
return function () {
test++;
console.log(test);
}
})();
increment(); //1
increment(); //2
Run Code Online (Sandbox Code Playgroud)
但是,如何使用常规函数语法调用它?
function increment() {
var test = 0;
return function () {
test++;
console.log(test);
}
}
increment()(); 1
increment()(); 1
Run Code Online (Sandbox Code Playgroud) 这是我正在尝试运行的简化版本:
for ( winDoorNo = 0; winDoorNo < aWinDoorSetSpec.no_of_winDoors; winDoorNo ++ ) {
(function (winDoorNo, self) {
self.tangentVectors_azimuth = [];
self.tangentVectors_polar = [];
self.tangentVectors_azimuth[winDoorNo] = tangentPlane.tangentVector_azimuth;
self.tangentVectors_polar[winDoorNo] = tangentPlane.tangentVector_polar;
})(winDoorNo, this);
}
Run Code Online (Sandbox Code Playgroud)
但我发现self.tangentVectors_azimuth数组只包含for循环索引变量的最后一个值.我发现这篇文章描述了一个类似的问题,我实现了建议的解决方案,即使用闭包.然而,这对我不起作用.执行for循环后,值this.tangentVectors_azimuth仍为:
[undefined, undefined, Object { x=0.01999999996662183, y=0.01599999957331022, z=0, more...}]
Run Code Online (Sandbox Code Playgroud) 以下是我的javscript的一部分(使用jquery).
list = ['a', 'b', 'c'];
for(var i = 0 ; i< list.length ; i++) {
$("<a>click here</a>").
click(function(){
foo(list[i]);
}).
appendTo('#sometag');
}
function foo(val) {
console.log(val);
}
Run Code Online (Sandbox Code Playgroud)
无论您点击哪个标签,都会打印c.如何打印正确值???
它似乎正在使用i = 3的最后一个值,因此总是评估oc
我已被证明我并不真正理解javascript封闭,我对以下代码感到困惑.我以为fxn会访问外部foo,但它实际上打印出"underfined".为什么??
var foo = "hello";
function fxn(){
alert(foo);
var foo = "test"
}
fxn();
Run Code Online (Sandbox Code Playgroud) 我正在阅读javascript忍者列表5.6的秘密.在解释中,作者要求将变量移动到全局范围.然后,创建另一个id为box2的id,并在box1上的animate之后立即调用box2上的animate,以显示闭包为变量提供的保护.我理解这个概念,但我得到的结果是断言语句的无限递归.我不明白这一点.
为什么会这样?为什么它会进入无限递归循环?
代码如下.
谢谢!
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Listing 5.6</title>
<script type="text/javascript" src="../scripts/assert.js"></script>
<link href="../styles/assert.css" rel="stylesheet" type="text/css">
<style type="text/css">
#box {
position: absolute;
border: 3px solid blue;
width: 200px; height: 200px;
background-color: #6495ed;
font-size: 2em;
}
</style>
</head>
<body>
<div id="box">????</div> <!--#1-->
<div id="box2">????</div> <!--#1-->
<script type="text/javascript">
var elem;
var tick;
var timer;
function animateIt(elementId) {
elem = document.getElementById(elementId); //#2
tick = 0; //#3
timer = setInterval(function(){ //#4
if (tick < 100) {
elem.style.left = elem.style.top = tick …Run Code Online (Sandbox Code Playgroud) 我使用jQuery生成按钮:
var button_a = $("<button />", {
text: 'A',
click: do_something,
class: "button a"
});
var button_b = $("<button />", {
text: 'B',
click: do_something,
class: "button B"
});
function do_something(){
alert("Button Was pressed");
}
Run Code Online (Sandbox Code Playgroud)
我想这样做do_something而不是:
function do_something(name){
alert("Button " + name + " was pressed");
}
Run Code Online (Sandbox Code Playgroud)
我应该如何改变jQuery的按钮创建,这样我可以在一传name的click: do_something?
是预先创建封闭的唯一解决方案吗?
function makeMultiplier(x){
return function(y) {
return x * y;
}
}
var by10 = makeMultiplier(10);
console.log(by10(7));
Run Code Online (Sandbox Code Playgroud)
当make multiplier只接受一个参数时,如何传入两个参数?我不确定这种语法是如何工作的.
我写了代码
// Handlers
function successHandlerFactory (savedFlag) {
return function (res, savedFlag){
if (res.data && res.status == 200) {
ngcoupon_offerManager.addOffers(res.data.offers, -1, savedFlag);
console.log('offers response', res, 'savedFlag', savedFlag);
} else {
console.error('something is wrong to get offers', res);
}
}
};
var offerSuccessHandler = function() {
return successHandlerFactory();
}();
var savedofferSuccessHandler = function () {
return successHandlerFactory(true);
}();
Run Code Online (Sandbox Code Playgroud)
但显然它给出了savedFlag undefined我所做的每一个任务.
为什么这不起作用