在iframe里调用parent.func()引出的js函数运行在它们被定义的作用域里,而不是它们被执行的作用域里

有个document里定义了一个函数func(),同时在document里嵌入了一个iframe,在这个iframe里调用父窗口的方法:parent.func(),本来我以为这个函数的运行环境是在这个iframe自己里面,测试发现虽然是在iframe里面调用的这个函数,但是运行环境依然是在父窗口里。

所以也验证了JS权威指南中的:js函数运行在它们被定义的作用域里,而不是它们被执行的作用域里。

又比如

var a=1;
function f1(){console.log(a);};
function f2(i){var a=2;f1();}
f2();//----1

当代码运行到调用某个函数时,作用域会切换到这个函数自身的作用域里,当这个函数调用完毕会再切换会原来的作用域,这两个作用域链是独立的,一个函数的作用域链由它被定义在哪决定。也正是因为函数运行在它们被定义的作用域里,才导致闭包可用。

本质解释:

ECMA-262标准:

在一个函数被定义的时候, 会将它定义时刻的scope chain链接到这个函数对象的[[scope]]属性。

在一个函数对象被调用的时候,会创建一个活动对象(也就是一个对象), 然后对于每一个函数的形参和局部变量,都命名为该活动对象的命名属性, 然后将这个活动对象做为此时的作用域链(scope chain)最前端, 并将这个函数对象的[[scope]]加入到scope chain中。

比如上例中的f1和f2被定义时,[[scope]]里都只有window对象这一级作用域,

调用f2()时,创建了一个活动对象,这个活动对象包括i和a两个属性,此时f2的[[scope]]包括活动对象和之前的window对象两级作用域;

调用f1()时创建的活动对象是空的。

所以当运行f2()时,能访问到的变量是:{i:undefined,a:2}---->window对象{a:1,f1:...,f2:..., ......},

在f2()里面运行f1()能访问到的变量是:window对象{a:1,f1:...,f2:..., ......},

所以此时访问到的a是属于window对象的,而无法访问到f2作用域链里的局部变量a。

时间: 2024-11-04 17:16:25

在iframe里调用parent.func()引出的js函数运行在它们被定义的作用域里,而不是它们被执行的作用域里的相关文章

C语言学习_C如何在一个文件里调用另一个源文件中的函数

问题 C如何在一个文件里调用另一个源文件中的函数,如题. 解决办法 当程序大了代码多了之后,想模块化开发,不同文件中存一点,是很好的解决办法,那我们如何做才能让各个文件中的代码协同工作呢?我们知道,main函数是程序入口,我们希望把不同的功能写在不同的函数中,并把这些函数统一放到另外一个文件里,以便main函数显得太长,main函数可以在用到某方法的时候调用来处理.为了实现这个步骤,我们这样做.首先定义一个c代码的头文件,如function.h,在里面声明将要实现的函数,如int add(int

iframe子页面js调用父页面js函数/父页面调用Iframe子页面中js方法

1.假设当前页面为a.html, iframe的src页面为b.html,其代码如下: 1 <span class="tag"><html> 2 <br></span><span class="tag"><head> 3 <br></span><span class="tag"><title></span><s

框架父子页面iframe相互调用方法

如果你采用嵌入iframe机制不可避免的要用到各个iframe页面之间方法和属性的相互调用.这里介绍的是兼容各个浏览器的iframe调用方式. 这里设定有3个页面一个父页面main.html它嵌入了两个iframe分别是childPage1.html和childPage2.html main.html有一个函数叫parentFunc().main.html代码如下 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"

JQuery iframe页面通过parent方法操作父页面中的元素与方法(实例讲解)

1)在iframe中查找父页面元素的方法: $('#id', window.parent.document) 2)在iframe中调用父页面中定义的方法和变量: parent.method parent.value 3)实例 1.父页面 复制代码 代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="If

父窗口与iFrame之间调用方法和元素

父窗口与iFrame之间调用方法和元素 父窗口调用子窗口: 调用元素 js格式: var obj=document.getElementById("iframe的name").contentWindow; var ifmObj=obj.document.getElementById("iframe中控件的ID"); ifmObj.click(); 实例: var obj=document.getElementById("ifm").content

Entity Framework 6 Recipes 2nd Edition(11-4)译 -&gt; 在”模型定义”函数里调用另一个”模型定义”函数

11-4.在”模型定义”函数里调用另一个”模型定义”函数 问题 想要用一个”模型定义”函数去实现另一个”模型定义”函数 解决方案 假设我们已有一个公司合伙人关系连同它们的结构模型,如Figure 11-4所示: Figure 11-4. A model representing the associate types in a company together with the reporting association 在我们的虚拟的公司里, , team members被一个team lea

android 关于为什么在onCreate里调用view.getChildAt(1).getLeft() 没有值!

关于为什么在onCreate里调用view.getChildAt(1).getLeft() =0 没有值! 因为跟android 页面生命周期有关系! 我们都知道安卓页面生命周期如下 onCreate 到 onStart 到onResume 到onPause到onStop到onDestroy 但是还有3个没列出来,就是 measure(测量) - layout(布局)-draw(开始画) 在onCreate的时候没有执行这3步,所以在onCreate里调用view.getChildAt(1).g

在ORACLE触发器里调用JAVA程序

因为项目需要,有一个已经写好的Java程序,想要在Oracle某个表的触发器中调用,以使得每次数据更新时,调用这个JAVA程序,来修改后台某个数据. 现将过程记录如下: 1.编写JAVA程序 [java] view plain copy public class Main { public static void modify(String statTime) { String datas = "/var/spool/cron/oracle"; File data = new File

关于在for循环里调用ajax时只能取到最后一个数据的bug的解决方法

首先,造成这中情况的原因在与ajax的异步请求机制,for循环的运行速度远大于ajax异步请求的速度,这就造成了ajax运行时,需要的在for循环里的参数已经运行到最后一个了,所以取到的都是最后一个参数数据. 解决方法:将ajax的请求封装成一个单独的方法,然后在for循环里调用该方法.