2017.4.07 js 中的function 实现的方式

函数分为FD (函数定义),FE(函数表达式) ,函数构造器得到的函数
(1)  FD 的栗子:
function getTaste(){
 .......
}
解析器遇到上面的function关键字,会解析上面的代码为函数定义的情况,凡是不符合上述格式的,会报错。
(2)FE的栗子:
var fn = function (){
  ......
}

解析器会把上面的function关键字解析为表达式的情况。本例中的function后面可有函数名字,但是仅限于函数定义内调用。外面调用会用fn。
var fn = function sbfn(){
  ......
  sbfn();  //
}

把function解析为表达式的情况,有另外的栗子:
1, function () {
  alert('anonymous function is called');
}();
此处为逗号运算符情况,取值逗号后面的结果undefined。

!function () {
alert('ECMAScript');
}();
此处为!运算符情况,后面结果返回undefined 。!取反,结果为true。

(3)函数构造器的栗子
其主要特点在于这种函数的[[Scope]]属性仅包含全局对象(window)

var x = 10;

function f() {

var x = 20;
var y = 30;

var bar = new Function('alert(x); alert(y);');

bar(); // 10, "y" 未定义

}

f();
顺便提醒一句,Function构造器既可使用new 关键字,也可以没有,这样说来,这些变体是等价的。

创建函数的算法

下面的伪码描述了函数创建的算法(与联合对象相关的步骤除外)。这些描述有助于你理解ECMAScript中函数对象的更多细节。这种算法适合所有的函数类型。

F = new NativeObject();

// 属性[[Class]]是"Function"
F.[[Class]] = "Function"

// 函数对象的原型是Function的原型
F.[[Prototype]] = Function.prototype

// 医用到函数自身
// 调用表达式F的时候激活[[Call]]
// 并且创建新的执行上下文
F.[[Call]] = <reference to function>

// 在对象的普通构造器里编译
// [[Construct]] 通过new关键字激活
// 并且给新对象分配内存
// 然后调用F.[[Call]]初始化作为this传递的新创建的对象
F.[[Construct]] = internalConstructor

// 当前执行上下文的作用域链
// 例如,创建F的上下文
F.[[Scope]] = activeContext.Scope
// 如果函数通过new Function(...)来创建,
// 那么
F.[[Scope]] = globalContext.Scope

// 传入参数的个数
F.length = countParameters

// F对象创建的原型
__objectPrototype = new Object();
__objectPrototype.constructor = F // {DontEnum}, 在循环里不可枚举x
F.prototype = __objectPrototype

return F

注意,F.[[Prototype]]是函数(构造器)的一个原型,F.prototype是通过这个函数创建的对象的原型(因为术语常常混乱,一些文章中F.prototype被称之为“构造器的原型”,这是不正确的)。

转载于:https://www.cnblogs.com/FineDay/articles/6677283.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/488653.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android checkbox 选中事件_使用Vue3.0新特性造轮子 WidgetUI3.0 (Checkbox复选框组件)

"title"标题示例代码&#xff1a;data [ { title: 新日小卫士二代, }, { title: 车子质量不合格, }, { title: 我买的骑士1号仪表台进水怎么回事&#xff1f;, }, { title: 风雅欧妮大灯高低调节, }]"title"标题和"desc"描…

服务器装系统用哪个好,服务器系统重装用哪个系统

服务器系统重装用哪个系统 内容精选换一换华为云帮助中心&#xff0c;为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档&#xff0c;帮助您快速上手使用华为云服务。重装裸金属服务器的操作系统。快速发放裸金属服务器支持…

2020图机器学习GNN的四大研究趋势

来源&#xff1a;专知【导读】以图神经网络为代表的图机器学习在近两年成为研究热点之一。近日&#xff0c;图机器学习专家 Sergei Ivanov 为我们解读了他总结出来的 2020 年图机器学习的四大热门趋势&#xff0c;包括图神经网络的理论理解、应用普及、应用、图嵌入框架&#x…

c++ 将文件内容输出到word上_原来PDF转Word可以这么简单,只需要一个键!办公起来真方便...

在职场办公中&#xff0c;我们经常接触到PDF文件&#xff0c;如果让你把PDF转换成Word&#xff0c;你还在束手无策吗&#xff1f;今天就来教你3种方法&#xff0c;如何将PDF转换成Word。01.复制粘贴法相信很多新手都只会【CtrlC/V】&#xff0c;虽然PDF文件不能直接被修改&…

python的类和实例_Python使用类和实例

我们可以使用类来模拟现实世界中的很多情景。类编写好后&#xff0c;你的大部分时间都将花在使用根据类创建的实例上。你需要执行的一个重要任务是修改实例的属性。你可以直接修改实例的属性&#xff0c;也可以编写方法以特定的方式进行修改。 Car类 下面来编写一个表示汽车的类…

iApp最新版无服务器多功能软件库源码

无需服务器的多功能软件库源码分享&#xff0c;仅需添加一个后台应用和一个文档即可 使用教程如下&#xff1a; 在浏览器中打开理想后台地址&#xff1a;http://apps.xiaofei.run/user/ 如果没有账号&#xff0c;请注册一个免费账号。 登录账号后&#xff0c;添加一个后台应…

二维数组求和 团队开发

题目:返回一个二维整数数组中最大联通子数组的和。 要求&#xff1a; 输入一个二维整形数组&#xff0c;数组里有正数也有负数。 求所有子数组的和的最大值。要求时间复杂度为O(n)。 开发方式&#xff1a;团队开发 主要思路&#xff1a;二维连通数组求最大子数组&#xff0c;我…

rpc协议微服务器,RPC协议及实现方式(分布式微服务治理的核心)

分布式微服务治理的核心在于: 微服务和分布式(微服务框架)微服务的最优技术实现目前是: SpringBoot(RPC 框架)分布式的最优技术实现目前是: Thrift,Motan,Dubbo,Spring Cloud(Netflix OSS),Finagle,gRPCRPC 是什么RPC 的全称是 Remote Procedure Call &#xff0c;是一种进程间…

2019年度全球工程前沿研究报告

来源&#xff1a;JAS自动化学报英文版1. 工程研究前沿1.1 Top 10 工程研究前沿发展态势信息与电子工程领域 Top 10 工程研究前沿涉及电子科学与技术、光学工程与技术、仪器科学与技术、信息与通信工程、计算机科学与技术、控制科学与技术等学科方向。其中&#xff0c;“面向光互…

python取数字第一位数_python基础:8.切片和缩进

0.前言如果可以的话&#xff0c;请先关注&#xff08;专栏和账号&#xff09;&#xff0c;然后点赞和收藏&#xff0c;最后学习和进步。你的支持是我继续写下去的最大动力&#xff0c;个人定当倾囊而送&#xff0c;不负所望。谢谢&#xff01;&#xff01;&#xff01;1.前提基…

python图像_Python图像处理库(PIL)

Python Imaging Library为您的python程序添加图像处理能力。这个库提供广泛的文件格式支持、高效的内部表示和相当强大的图像处理能力。 核心图像库是为快速访问几种基本像素格式图像设计的。它能为一般的图像处理工具提供一个可靠的基础。 这个Pythonic library可以 装载和保存…

在JS中如何判断所输入的是一个数、整数、正数、非数值?

1、判断是否为一个数字&#xff1a; Number&#xff08;num&#xff09;不为 NaN&#xff0c;说明为数字 2、 判断一个数为正数&#xff1a; var numprompt("请输入&#xff1a;");if(Number(num)>0){document.write("您输入的是一个正数&#xff01;")…

怎么开通手机信息服务器,如何用手机建立网站

如何用手机建立网站 内容精选换一换本文以营销版网站配置为例&#xff0c;介绍如何通过云速建站服务快速创建一个网站。云速建站操作简单方便&#xff0c;只需四步&#xff0c;就可以轻松创建一个网站。建站流程开通网站&#xff1a;包括购买营销版站点、购买精美模板(可选)和安…

cmd测试cuda安装_安装:anaconda+cuda+pytorch+pycharm

每次安装都要在网上各种搜索&#xff0c;为了下次安装的时候简单一点&#xff0c;把对我安装帮助较大的链接整理了一下&#xff0c;整个过程仅供参考&#xff1a;除了pycharm&#xff0c;其他位置均不建议更改默认位置&#xff0c;建议全程可开着cmd1、anaconda安装直接下载&am…

AI会完美的执行我们设定的目标,但这不是一个好消息

来源&#xff1a;混沌巡洋舰导读&#xff1a; 科普网站quanta magazine上一篇名为 Artificial Intelligence Will Do What We Ask. That’s a Problem的文&#xff0c;是关于AI与人际交互时&#xff0c;如何满足更好的理解人类需求。该文的核心观点是&#xff1a;通过教机器理解…

浏览器 刷新页面后回到顶部_推荐 3 个实用的 chrome 浏览器扩展

The Great Suspender同时打开太多的网页会极大的消耗电脑系统资源。The Great Suspender 会把长时间不用的网页冻结&#xff0c;从而释放被这些网页占据的内存和 CPU。扩展安装完成后&#xff0c;会自动跳出设置界面。你可以设置「多久后自动冻结标签」&#xff0c;建议选择一个…

[游戏开发-学习笔记]菜鸟慢慢飞(12)- Unity3D中LitJson 解析遇到的问题

1.数据格式问题 问题&#xff1a;服务器那边设置的HP的类型是float&#xff0c;如果传给客户端的是1000&#xff0c;没有小数点解析的时候LitJson会优先按照int去解析。但是呢&#xff0c;服务器回头还有可能传回的是1000.50这样带小数点的。我们写死解析对应的数据类型&#x…

华为服务器更换主板后怎么进系统,服务器更换主板

服务器更换主板 内容精选换一换华为云帮助中心&#xff0c;为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档&#xff0c;帮助您快速上手使用华为云服务。如果弹性负载均衡实例使用的证书过期或者其它原因需要更换&#xf…

圆弧半径计算图解_刀尖圆弧半径补偿G40,G41,G42 左补偿右补偿你真的能搞清楚吗...

当编写数控轨迹代码时&#xff0c; 一般是以刀具中心为基准。 但实际中&#xff0c; 刀具通常是 圆形的&#xff0c;刀具中心并不是刀具与加工零件接触的部分&#xff0c; 所以刀具中心的的轨迹应 偏离实际零件轨迹一个刀具半径的距离。 简单的将零件外形的轨迹偏移一个刀具 半…

python tensorflow多个输入_十分钟带你入门最新Python的AI库TensorFlow 2.0

去年11月&#xff0c;TensorFlow庆祝了它的第三个生日。多年来&#xff0c;它成为最受欢迎的ML 框架之一&#xff0c;并拥有了大量的粉丝。TensorFlow庆祝了它的第三个生日谷歌将这个框架融入Java&#xff0c;C &#xff0c;JavaScript&#xff0c;最重要的是融入主要的数据科学…