我对JavaScript范围有一些了解 - 该语言具有函数级范围,并且变量和函数声明被提升到其包含范围的顶部.但是,我无法弄清楚为什么以下两段代码记录不同的值:
这会将值1记录到控制台:
var a = 1;
function b() {
a = 10;
return;
function a() {}
}
b();
console.log(a);
Run Code Online (Sandbox Code Playgroud)
神秘的是,这记录10:
var a = 1;
function b() {
a = 10;
return;
}
b();
console.log(a);
Run Code Online (Sandbox Code Playgroud)
那么引擎盖下面发生了什么?
我似乎无法理解JavaScript变量的特定范围.与我发现的其他示例和问题不同,我对嵌套函数的范围感兴趣.
我在这个JSFiddle上建立了一个例子.相关部分如下:
function MyObject() {
var self = this;
var a = 1;
this.b = 2;
var innerMethod = function() {
//1 and 2: direct reference
logMessage("a = " + a); // a = 1
//logMessage("b = " + b); // Error: b is not defined
//3 and 4: using this
logMessage("this.a = " + this.a); // this.a = undefined
logMessage("this.b = " + this.b); // this.b = undefined
//5 and 6: using self
logMessage("self.a = " + …Run Code Online (Sandbox Code Playgroud) 我一直在阅读使用HTML5和JavaScript的游戏设计,它向我介绍了对象.因此,在阅读完本书并开展项目后,我决定采用这些新发现的知识并将对象集成到我自己的项目中.所以这是我的问题可以或应该对象调用自己的函数?例如:
var someObject = {
start: function() {
check();
},
check: function() {
console.log("Check!");
}
};
someObject.start();
Run Code Online (Sandbox Code Playgroud)
这本书确实展示了一个带有计时器的例子:
var timer = {
start: function() {
var self = this;
window.setInterval(function(){self.tick();}, 1000);
},
tick: function() {
console.log('tick!');
}
};
Run Code Online (Sandbox Code Playgroud)
在带有timer对象的示例中,它为self调用内部函数,因此这意味着我应该使用self来调用内部函数,或者这是使用对象执行此操作的正确方法吗?还是最佳实践?提前致谢.
var someObject = {
start: function() {
var self = this;
self.check();
},
check: function() {
console.log("Check!");
}
};
someObject.start();
Run Code Online (Sandbox Code Playgroud) 我需要了解JavaScript中变量环境与词法环境之间的区别.实际上我会查看stackoverflow和doc中提供的一些注释,但是很难理解.如果你因为我的英语知识不好而向我解释,我会很高兴的.
$ 11.4/5 - "[...]类中定义的友元函数位于定义它的类的(词法)范围内[...]
这句话是什么意思?
struct A{
typedef int MYINT;
void f2(){f();} // Error, 'f' is undefined
friend void f(){MYINT mi = 0;} // Why does this work, shouldn' it be A::MYINT?
void f1(){f();} // Error, 'f' is undefined
};
int main(){}
Run Code Online (Sandbox Code Playgroud)
令人困惑的是,从'A :: f1'调用'f'是可以理解的.然而,当一个朋友处于好友阶层的"词汇"范围时,为什么从'A :: f2'调用'f'是不正确的?"词汇"范围意味着什么?
在同一类型中,为什么在"f"中使用'MYINT'可以?不应该是'A :: MYINT'吗?
如果我将'A*'类型的参数添加到'f',那么'f1'和'f2'都能够因为ADL而找到'f'.这是可以理解的.
我试图JavaScript从onclick触发器调用函数.
HTML 部分:
<div class="my_radio">
<input type="radio" name="my_radio" value="1" onclick="my_func()"/> first button
</div><!-- end of class my_radio -->
Run Code Online (Sandbox Code Playgroud)
和JavaScript代码
<script type="text/javascript">
$(document).ready(function(){
function my_func(){
alert("this is an alert");
}
});
</script>
Run Code Online (Sandbox Code Playgroud)
这是行不通的.
但是,如果我将该JavaScript功能 保留在$(document).ready()代码之外,它就可以工作.以下是相关的代码段:
<script type="text/javascript">
$(document).ready(function(){
function my_func111(){
alert("this is an alert");
}
});
function my_func(){
alert("this is an alert");
}
</script>
Run Code Online (Sandbox Code Playgroud)
1)为什么第一个JavaScript代码片段不起作用?
2)如何让第一个JavaScript代码段工作?
编辑:
因此我知道,$(document).ready()当网页完全加载时执行.那么my_func()如果我my_func()在外面写,如何防止在完整页面加载之前或之后激活$(document).ready()?
Scala反射非常复杂.它包含类型符号和镜像.你能告诉我他们之间的关系吗?
我希望能够在if语句中调用函数.
例如:
var photo = "yes";
if (photo=="yes") {
capturePhoto();
}
else {
//do nothing
};
Run Code Online (Sandbox Code Playgroud)
这没什么.该函数在if语句之上明确定义.
编辑:哇,下到地狱!capturePhoto(); 只是一个示例函数,在这种情况下真的不需要任何解释?
我一直在做一些javascript阅读,并且我已经收集到一个闭包只能访问闭包"包装"它,或者,你可能会说它是直接的父.现在我已经玩了一点,我在这个jsfiddle中看到即使是深层嵌套函数也可以访问定义的vars.
任何人都可以解释一下吗?或者解释一下我完全错了什么?
http://jsfiddle.net/tPQ4s/function runNums() {
this.topVar = 'blah';
return function(){
(function() {
(function() {
console.log(topVar);
})();
})();
}
}
var someFunc = runNums();
someFunc();
Run Code Online (Sandbox Code Playgroud)