网页中如果包涵了frameset未声明的标识符符则不是再包涵哪个未声明的标识符符???

标识符解析在闭包中理解-javascript-电脑编程网标识符解析在闭包中理解作者:%e8%93%9d%e8%8e%93%e8%b0%83%e8%b0%83 和相关&&&闭包使用时一个常出现的错误,现分析一下,给例子:
function foo(){
for(i = 0; i & 10; i++){
setTimeout(function(){
console.log(i);
//10,10,10,10,10,10,10,10,10,10
这是秘密花园给的例子,在setTimeout方法里创建了一个闭包,调用了外层函数的 i 属性。连续10次调用setTimeout方法,在1秒后连续输出了10个数字。这里调用setTimeout方法主要是用来引入闭包的。
那么例子中,setTimeout里使用的 i 为什么不是循环中实时的 i 呢?
这里涉及到JS中函数调用时的标识符查找过程,例子中 i 就是匿名函数所要查找的标识符。
首先什么是标识符(Identify)?
var bar = &Jberry&;
// 'name' is a identify
function foo(para){...}
// 'foo' is a identify
// 'para' are identifies
变量的声明符号名 &bar& 、函数声明的函数名 &foo&、函数的形参 &para'三者是标识符。
在《高性能Javascript》一书里我们知道,标识符的查找是一个延着活动链域(scope chain)从本地环境到全局环境的搜索过程。ECMAScript里写道:
The result of evaluating an identifier is always a value of type Reference with its referenced name componentequal to the Identifier String.
因此,当在查找到所需的标识符时,会返回最近活动对象里、以目标标识符为名称的引用类型对象,然后调用getValue(identify)方法来获取标识符的值。
如果没有找到标识符,那么返回ReferenceError,JS中显示该标识符值为 &undefined&。
那么为什么找到的是引用的对象而不是值的副本?
大家都知道,变量的范围与其所在的环境,也就是域 scope相关。
在C中有块级域(block-level scope,如 if、while块)、函数域(function-level scope)的概念,通过设置块(block)和定义函数可以决定同名变量的归属。
而在JS中没有块的概念,只有函数域(function-level scope)的概念,通过函数的定义来决定变量的归属。在JS中函数是一等(first-class)的,可以像普通数据一样,按字面上创建,像参数一样传递,或从其他函数中作为值返回,而在C中不行。
同时,函数的执行也与环境相关。
在C函数的调用中,通过调用栈(call-stack)的形式执行函数中的代码。当运行函数时,将函数的环境和代码段压入栈中,根据栈中的环境执行代码段,等函数执行完毕后,参数从栈中弹出。这里的环境,就是C函数所需的参数副本。
而在JS的函数的调用中,函数同样也有两个部分&&环境和代码段。而这里的环境有两部分,一部分是函数在创建时的静态的词法环境,也就是scope chain。该环境里是一系列的变量对象,里面保存着外部环境的标识符和值。还有一部分是函数在执行的时候动态创建、并加在scope chain最前面的活动对象,里面包括函数执行期的参数、内部变量以及实时绑定的 'this'。两个环境加起来就是函数执行时的完整的scope chain。
可以看到,JS里的函数是在scope chain里查找标识符,实际上是一个在各个变量对象、活动对象里查找的过程。而对象是放在堆里,而不是栈里。因而与C中调用栈(call-stack) 的概念不同,这里更像是调用堆(call-heap)的概念。每次标识符的查找就是从堆中找对象的过程。堆中存的是表示环境的对象,只有用引用,而不是压栈的方式获取它;也只有用JS的回收机制,而不是出栈的方式清除它。
这可能从另一方面解释了JS中Everything is Object的概念吧。
回到例子中,当1秒钟后去执行setTimeout方法的匿名函数时,上层 foo 函数中的 for 循环已经结束,i 值此时为10。
而匿名函数在调用时,是去查找保存有 i 的变量对象,这个对象表示 foo 函数此时的运行环境。由于此时 foo 函数已运行结束,i 值已经变成10了。
因此,返回 i 标识符的引用对象里的值是10,而不是foo循环里 i 的副本了。
要解决的方法很简单,就是让匿名函数在外层函数里实时的运行,而不是等到外层函数结束后,才在变量对象里去查找需要标识符。
function foo(){
for(i = 0; i & 10; i++){
setTimeout((function(e){
return function(){
console.log(e);
})(i),1000);
/***********or************/
function foo(){
for(i = 0; i & 10; i++){
(function(e){
setTimeout(function(){
console.log(e);
//0,1,2,3,4,5,6,7,8,9
看了上面的分析,根据闭包的定义:
A&closure&is a&pair&consisting of the function&code&and the&environment&in which the function is&created.
闭包是由函数体和函数创建时的环境组成。
相信也能对 &All&functions in ECMAScript are&first-class&and&closures& 这句话有所理解了吧。
打完手工!
(对C理解的不深,有些地方YY了下,欢迎拍砖~)相关资料:||||标识符解析在闭包中理解来源网络,如有侵权请告知,即处理!编程Tags:                &                    9. 下面哪一个不是正确的标识符( ) A. $persons B. #point C. _super D. hello_百度知道
9. 下面哪一个不是正确的标识符( ) A. $persons B. #point C. _super D. hello
并且开头不得为数字,D都是合法的标识符。B选项不是正确的标识符。所以选项C。对于选项A,也是合法的,程序验证了标识符只能有数字字母下划线三者组成
其他类似问题
标识符的相关知识
按默认排序
其他1条回答
下载知道APP
随时随地咨询
出门在外也不愁网页设计中,经常要用到&br /&:换行标识符。一个&br /&换行标签占多少像素?_百度知道
网页设计中,经常要用到&br /&:换行标识符。一个&br /&换行标签占多少像素?
提问者采纳
&#47,换行的高度就不同;&lt:&lt:10px&div style=&比起来;&font-&&br/div&div&gt:50px&&div style=&换行标签的高度跟着它外层容器的文字大小属性走的&和&&/&font-size。比如;&br/&br &#47
提问者评价
原来是这样,感谢!
其他类似问题
按默认排序
其他2条回答
图片就越清晰。在网页中只能说它占用了多少字节的容量像素是用在图片的清晰度上用的概念,像素越大
像素是图片用的 不是字符用的
您可能关注的推广回答者:
标识符的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁提问回答都赚钱
> 问题详情
选出下列标识符中不是合法的标识符的是( 。 A.hot_doB.cat1C._priD
悬赏:0&&答案豆&&&&提问人:匿名网友&&&&提问收益:0.00答案豆&&&&&&
选出下列标识符中不是合法的标识符的是( 。 A.hot_doB.cat1C._priD.2ab请帮忙给出正确答案和分析,谢谢!
发布时间:&&截止时间:
网友回答&(共0条)
回答悬赏问题预计能赚取&3.00元收益
回答悬赏问题预计能赚取&3.00元收益
回答悬赏问题预计能赚取&4.00元收益
回答悬赏问题预计能赚取&1.00元收益
回答悬赏问题预计能赚取&3.00元收益
回答悬赏问题预计能赚取&4.00元收益
回答悬赏问题预计能赚取&3.00元收益
回答悬赏问题预计能赚取&1.00元收益
回答悬赏问题预计能赚取&4.00元收益
回答悬赏问题预计能赚取&3.00元收益
回答悬赏问题预计能赚取&1.00元收益
回答悬赏问题预计能赚取&3.00元收益
回答悬赏问题预计能赚取&3.00元收益
回答悬赏问题预计能赚取&3.00元收益
回答悬赏问题预计能赚取&1.00元收益
回答悬赏问题预计能赚取&1.00元收益
回答悬赏问题预计能赚取&4.00元收益
回答悬赏问题预计能赚取&3.00元收益
回答悬赏问题预计能赚取&1.00元收益
回答悬赏问题预计能赚取&1.00元收益
回答悬赏问题预计能赚取&3.00元收益
回答悬赏问题预计能赚取&1.00元收益
回答悬赏问题预计能赚取&10.00元收益
回答悬赏问题预计能赚取&1.00元收益
回答悬赏问题预计能赚取&1.00元收益
回答悬赏问题预计能赚取&1.00元收益
回答悬赏问题预计能赚取&4.00元收益
回答悬赏问题预计能赚取&5.00元收益
回答悬赏问题预计能赚取&3.00元收益
回答悬赏问题预计能赚取&5.00元收益
回答悬赏问题预计能赚取&5.00元收益
回答悬赏问题预计能赚取&3.00元收益
回答悬赏问题预计能赚取&5.00元收益
回答悬赏问题预计能赚取&4.00元收益
回答悬赏问题预计能赚取&4.00元收益
回答悬赏问题预计能赚取&1.00元收益
回答悬赏问题预计能赚取&1.00元收益
回答悬赏问题预计能赚取&3.00元收益
回答悬赏问题预计能赚取&1.00元收益
回答悬赏问题预计能赚取&1.00元收益
回答悬赏问题预计能赚取&5.00元收益
回答悬赏问题预计能赚取&5.00元收益
回答悬赏问题预计能赚取&10.00元收益
回答悬赏问题预计能赚取&1.00元收益
回答悬赏问题预计能赚取&4.00元收益
你可能喜欢的
[] [] [] [] [] [] [] [] [] [] [] []
请先输入下方的验证码查看最佳答案printf为什么不是合法的标识符?_百度知道
printf为什么不是合法的标识符?
提问者采纳
因为printf是系统标识(又称系统关健字),所以不能拿来定义为用户标识符。
提问者评价
谢谢,那系统关键字还有那些,关键字不是只有32个吗?其中并不包含系统关键字printf啊?
其他类似问题
printf的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁}

我要回帖

更多关于 ora 00904 标识符无效 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信