我最近一直在读关于闭包的文章,我有点困惑,因此有几个问题。
所以我认为闭包就是当你在一个函数中使用一个变量的时候,这个变量位于你的直接词法作用域之外。我经常听到的另一个定义是..‘保留变量的副本,就像它们在函数完成执行之前一样’。
假设我有一个带有私有变量的函数:
function foo() {
var x = 'abc';
return function() {
return x;
}
}
var bar = foo();
console.dir(bar) // [[Scopes]] - 0: Closure { x: 'a
function one() {
function two() {
alert(i);
}
return two;
}
(function() {
var i = 3;
var f = one();
f(); // Uncaught ReferenceError: i is not defined
}());
我读过的文章说,当一个函数被调用时,一个新的执行上下文被添加到堆栈中,作用域链是通过遍历堆栈来创建的。但在上面的代码中,这肯定会导致3被警告?
它是如何计算出作用域链的?
我不明白范围是什么。我在某处读到,作用域是访问varible的方法。但是当一个变量可以通过作用域访问时,我发现很难想出一个例子。一个函数中的所有变量都可以通过'global‘或'activation/variable’对象的上下文或者通过闭包来访问。下面这段代码演示了我的意思:
var global_var = 7;
var f = (function() {
var closure_var = 5;
return function() {
var local_var = 3;
alert(local_var); // aler
我遇到了下面这段奇怪的代码:
function foo(){
works = {hello:"world"};
function bar(){
alert('does not work');
}
var notwork = {hello:"world"};
}
foo();
alert(works.hello);
alert(notwork.hello);
有人能给我解释一下为什么工作是有效的,而不是工作是不起作用的?或者给我指出一个很好的资源,详细解释这一点。
非常感谢!
我不明白这一点--在if条件中定义的var怎么能在该条件之外使用?
示例JS:
if (1===2) {
var myVar = "I live in brackets";
}
$("#debug").append("myVar = " + myVar);
$("#debug").append("but I'm about to throw a 'not defined' exception right... now " + firstAppearanceVar);
渲染:myVar =
我只是想知道这两者有什么区别
File1.js
$(function()
{
function MyFunction()
{
// some code here
}
});
File2.js
$(function()
{
// call it.
MyFunction();
});
File1.js
function MyFunction()
{
// some code here
}
File2.js
$(function()
{
// call it.
MyFunction();
我读过关于JavaScript闭包的超级帖子,在我找到的答案之间似乎有一些出入,我希望我能得到一些进一步的澄清。
线程中的一些答案是在内部函数引用外部函数的变量时创建闭包的。
我找到了另一个答案,说这是一个终结:
var a = 42;
function b() { return a; }
注意,这里没有内部/外部函数,而只是一个函数。person给出的解释是,闭包是函数引用外部作用域的时候。
所以我的问题是,只有当有两个函数(内函数和外部函数),或者函数引用外部作用域时才创建闭包,而外部作用域可能是函数,也可能不是函数(在本例中,它只是顶级作用域)?
function onMouseClickFunction() {
$mapCanvas.click(function (e) {
var x = cursor.getCursorPositionInCanvasX(e.pageX),
y = cursor.getCursorPositionInCanvasY(e.pageY);
本例中的变量作用域是函数onMouseclickFunction还是jquery的匿名函数?
我想说的是,javascript在其父函数的顶部使用了hoisting创建变量,那么在这个例子中,hoisting是在哪里
当我们尝试这段代码时,它不能工作。
public class f {
public static void main(String[] args) {
{ // aussen
int a = 1;
int b = 2;
{ // innen
System.out.println(a);
// gibt 1 aus
int b = 3;
Sy
考虑以下代码:
function nepaliBuddha() {
var a = 20;
return function buddhaNepal() {
console.log(a);
}
}
var closure = nepaliBuddha();
closure(); // logs 20
现在,当我们调用closure时,输出是20。这证明了内部作用域属性([[scope]])是分配给定义它的内部函数的,或者说,当declared.If在声明时没有分配时,就无法在不同的上下文中调用它时记录20。
调用closure()时,函数上
我有一些AJAX,它使用setInterval()显示进度条来获取脚本的当前进度。我的问题是,当进度达到100%时,我似乎不能扼杀它。我不确定这是否与作用域有关,但我的处理程序是全局的,所以我不知道为什么它不能工作。这就是我所拥有的:
function showLog(){
document.getElementById('log').style.display = "block";
clearInterval(inth);
return false;
}
function startAjax(){
var inth = set
我正在尝试学习JS,关于javascript闭包,我有一个问题-
function fooOuter(){
var a = 10;
var b = 20;
return function fooinner(x){
return a + b + x;
};
}
这是否意味着Javascript中的内部函数存储了对同一作用域中所有变量的引用。也就是说,在这种情况下,fooinner存储变量a和b的引用。
假设我有一个内联脚本标记,它有一个非常简单的代码,如下所示
(function() {
var test = "This is a simple test";
function modifyTest(s) {
s = "Modified test text";
};
modifyTest(test);
console.log(test) //Will still display "This is a simple test"
})();
但是,如果我使用test = modifyTest(test);,则应用更改,我的问题是
只是想知道在这个函数中什么会被认为是我的局部作用域?只是有点迷惑。
function hello(name, age) {
var message = name + ", who is " + age + " years old, says hi!";
return function sayHello() {
console.log(message);
};
}
var sayHelloToJohn = hello("John", 33);
sayHelloToJohn();
这可能是个问题。下面的代码就像我想要的那样工作,但我不知道为什么。
var x = 0
init_page = function(){
x++;
var y = x;
setTimeout(go, 1000);
function go(){
$('body').append('<div>Y: '+y+'</div>');
}
}
init_page();
如果你快速点击链接几次,它会打印1,2,3,4.
我的问题是,它们都调用了相同的函数,但它的作用就好像
我主要用JS编写代码,但我猜这将适用于许多语言。 在函数中使用全局/更高作用域变量与使用传递到函数中的变量之间的有效区别是什么,反之亦然? let somevariable = 5 ;
function somefuntion() {
let scopedvariable = 10;
return scopedvariable*myvariable
}
somefunction();
// OR
let myvariable = 5 ;
function somefuntion(somevariable ) {
let scopedvariable = 10;
re
在下面的python示例中,方法和属性似乎超出了范围,但它们仍然有效,这是怎么回事?
for module in output:
a = 1
attributes=[]
methods=[]
for branch in module[2]:
for leaf in branch[2]:
if leaf[0]=="method":
methods.append(leaf[1])
if leaf[0]=="attribute":
我期待着下面变量var1的多个定义的错误消息(或者至少是警告)。这意味着这不是一个多重定义吗?是主变量的作用域,它与主变量的作用域是不同的。
#include <stdio.h>
int var1;
int main (void)
{
int var1;
var1=12;
printf("%d",var1);
}