我正在尝试学习JS,关于javascript闭包,我有一个问题-
function fooOuter(){
var a = 10;
var b = 20;
return function fooinner(x){
return a + b + x;
};
}
这是否意味着Javascript中的内部函数存储了对同一作用域中所有变量的引用。也就是说,在这种情况下,fooinner存储变量a和b的引用。
我遇到了这个问题,我希望一个函数可以从外部访问,但它也需要继承一些基于作用域的属性,因为它在JSON.stringify()中作为一个可选的字符串符使用,所以不能有额外的上下文传递给它。
假设我有这样的代码
let object = {
function1(){
let a = 1
console.log(object.function2()) // a is not defined undefined
},
function2(){ return a }
}
所以我想知道是否有一种方法可以改变function2的闭包/作用域状态,比如绑定一个新的this上下文,
你能澄清我下面的误解吗?
如果JS中函数的执行上下文是在调用/调用函数时创建的,而不是在声明函数时创建的,那么在下面的代码中,内部是闭包吗?如果有,原因何在?inner还没有被调用,因为执行上下文是在调用时创建的,所以inner不可能存储对i的引用。
function foo(i) {
function inner() {
return i;
}
return inner;
}
var f = foo(3);
内部何时会引用foo的执行上下文?当它被调用时,还是在它被定义时?在上面的代码中,我还没有调用内部函数。
另外,如果您能解释一下JS在看到函数定义(与函数
考虑以下代码:
function nepaliBuddha() {
var a = 20;
return function buddhaNepal() {
console.log(a);
}
}
var closure = nepaliBuddha();
closure(); // logs 20
现在,当我们调用closure时,输出是20。这证明了内部作用域属性([[scope]])是分配给定义它的内部函数的,或者说,当declared.If在声明时没有分配时,就无法在不同的上下文中调用它时记录20。
调用closure()时,函数上
我正在学习大卫·弗拉纳根( David )的“JavaScript: The going ”,我和他在下面的例子中左右为难:
window.onload = function() {
var elements = document.getElementsByClassName("reveal");
for(var i = 0; i < elements.length; i++) {
var elt = elements[i];
var title = elt.getElementsByClassName("handl
当创建闭包(在Javascript或C#中)时,创建闭包时作用域中的所有变量是否都“包含”在其中?或者只是在新创建的方法中引用的变量?
示例C#代码:
private void Main() {
var referenced = 1;
var notReferenced = 2; // Will this be enclosed?
new int[1].Select(x => referenced);
}
Javascript代码示例:
var referenced = 1;
var notReferenced = 2; // Will thi
我读过关于JavaScript闭包的超级帖子,在我找到的答案之间似乎有一些出入,我希望我能得到一些进一步的澄清。
线程中的一些答案是在内部函数引用外部函数的变量时创建闭包的。
我找到了另一个答案,说这是一个终结:
var a = 42;
function b() { return a; }
注意,这里没有内部/外部函数,而只是一个函数。person给出的解释是,闭包是函数引用外部作用域的时候。
所以我的问题是,只有当有两个函数(内函数和外部函数),或者函数引用外部作用域时才创建闭包,而外部作用域可能是函数,也可能不是函数(在本例中,它只是顶级作用域)?
请考虑下面的代码,它创建了附加到web地图中某个点的按钮列表。
一开始,我考虑扩展元素并将点添加为属性,但由于它不是,所以我只是在事件函数中引用对象。
pointsInMap = [
{
x : 20.2,
y : 15.2,
name : "point1"
},
{
x : 20.2,
y : 15.2,
name : "point2"
},
{
x : 20.2,
y : 15.2,
name : "p
我正在学习闭幕式,并有基本的怀疑。
function makeCounter() {
let count = 0;
return function() {
return count++;
};
}
let counter = makeCounter();
在这里,当我们返回函数时,它有带有外部作用域的闭包。所以它有一个计数结束。
var x = 1;
function func() {
console.log(x); // does func has closure with x ??
}
func();
所以我的问题是,只有嵌套函数才能使闭包??或者最高层
闭包中的局部函数声明了一个与闭包中存在的变量同名的变量。那么,我们如何从本地函数访问闭包的变量呢?
function closure()
{
var xVar;
function func1()
{
var xVar;
// how to distinguish local and closure scopes.
return xVar;
}
return function () { return func1(); };
}
创建一个私有对象并将私有变量作为该对象的属性可能会有所帮助。但我想知道是否有更好
我很难理解JavaScript函数级别的作用域,作为一个C#程序员,我会尝试通过代码来解释它:
CODE#1
//Problem
//if same named variable (as in global scope) is used inside function scope,
//then variable defined inside function will be used,global one will be shadowed
var a = 123;
function func() {
alert(a); //returns undefined,why not just
我对Javascript编程比较陌生。我正在编写一个示例,在从HTML调用对象的方法时遇到了困难。我怀疑这与方法的作用域或外部化有关,但我不确定。
index.html:
<script type="text/javascript">
var f = new Fred();
f.bar();
f.foo();
</script>
Fred.js:
function Fred() {
this.a = 1;
function foo() {
if (a == 1) {
a++;
}
var e = 0;
}
t
我创建了一个javascript代码片段,下面是指向的链接
function Foo(name) {
this.name = name
this.speak = function() {
console.log(this.name)
}
}
function init() {
function init_() {
var foo = new Foo('foo')
foo.hear = function() {
console.log('i can hear')
}
var bar = new
var main = {
doSomething: function(){
function firstOne(){}
function secondOne(){
$.ajax({
success: function(){
firstOne(); /* here I want the previous function */
}
});
}
}
}
如何从标记的行运行firstOne()函数?这可能是一个低级的问题,但我不理解JS名称
看起来每个作用域都有很多var是浪费字节和不良的代码习惯。我不知道如何修复我的代码。如何按照JS好的做法编辑下面的行?
<script type="text/javascript">
// <![CDATA[
var jump_page = '{LA_JUMP_PAGE}:';
var on_page = '{ON_PAGE}';
var per_page = '{PER_PAGE}';
var base_url = '{A_BASE_URL}';
var