什么是strict function

strict function,严格函数。什么是严格函数呢?

学术上的定义是:

假如有一个函数f。

我们定义

其中是一个表达式,这个表达式要么没有返回值,要么是一个死循环(或者循环直到出错退出)。

这就是严格函数。

通俗来讲,如果一个函数被调用前,它的参数被完全计算求值了,那么它就是一个严格函数。

与严格函数相反的是非严格函数,非严格函数被调用时,它的参数可能没有被计算求值,这也叫做惰性求值(lazy evaluation)。

惰性求值有什么好处呢?

除可以得到性能的提升外,惰性求值的最重要的好处是它可以构造一个无限的数据类型。

举个栗子:

在纯函数式编程语言Haskell中,一个斐波那契可以如下定义:

fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

在Haskell中,“:”表示在数列后追加一个元素,tail呢,返回去掉第一个元素的数列,zipWith使用指定的函数(这里是加)来合并两个数列中的元素到一个新数列中。

这个语句不容易理解,实际上,zipWith相加的是两个数列,fibs和tail fibs,生成的是一个新的数列,追加到了0和1的后面。

fibs是无限长的。如果这里不是惰性求值,那么这条语句将会导致内存耗尽。。。

这就是惰性求值的好处。

自然,严格函数就是非惰性求值函数,或及早求值函数。

如果一门编程语言只支持严格函数,那么该语言就可以叫做严格编程语言。

现在几乎所有的编程语言都是严格。

比如,C#,Java,Perl,Python,Ruby,Common Lisp,ML都是严格的。

而Haskell,Miranda,Clean都是非严格的。

但是像C,C++,Scheme,它们的普通函数都是严格的,但是自带的宏系统能够定义非严格函数。

时间: 2024-10-20 17:59:53

什么是strict function的相关文章

Function javascript

通常而言,一个函数是一个子程序,他们可以被外部代码调用(亦或被滴管函数在内部调用).和程序一样,函数是由一系列声明(被称为函数体function body)组合而成.值可以传递给函数,并且函数可以返回一个值. 在javascript中,函数是一个对象,因为她可以拥有属性和方法,就像对象一样.将函数和对象区分的是函数可以被调用,他们是函数对象(Function objects). 描述 js中的所有函数都是函数对象Function object 函数和程序不一样,函数总是返回一个值,但是程序不一定

带有“非简单参数”的函数为什么不能包含 "use strict" 指令

非简单参数就是 ES6 里新加的参数语法,包括:1.默认参数值.2.剩余参数.3.参数解构.本文接下来要讲的就是 ES7 为什么禁止在使用了非简单参数的函数里使用 "use strict" 指令: function f(foo = "bar") { "use strict" // SyntaxError: Illegal 'use strict' directive in function with non-simple parameter li

为什么使用"use strict"可以节约你的时间

转: http://ourjs.com/detail/52f572bf4534c0d806000024 "use strict"是JavaScript中一个非常好的特性,而且非常容易使用. 使用方法 // file.js"use strict"function doStuff(){    // use strict is enabled here!} 这样佻的file.js都会应用上"use strict"模式.如果你仅想在一个函数中使用: //

"use strict"

"use strict";//严格模式 <!doctype html> <html> <head> <meta charset="utf-8"> <title>无标题文档</title> </head> <body> <script> "use strict"; (function() { var a = b = 5; })();//这个会

strict 严格模式

严格模式可以让你更早的发现错误,因为那些容易让程序出错的地方会被找出来 打开严格模式:"use strict" 不支持的javascript引擎会忽略它,当作是一个未赋值字符串.如果在一个脚本使用全局使用严格模式,那么在同一个页面的其他脚本也会严格.也可以在某个函数里声明使用严格模式. 在平时,没有声明直接使用的变量作为全局变量处理 number = 1: 在严格模式里,会抛出引用错误(referenceerror) 同时变量是无法delete的,在平时 delete number会安

(function(){}())写法的用途

全局命名空间污染与 IIFE 总是将代码包裹成一个 IIFE(Immediately-Invoked Function Expression),用以创建独立隔绝的定义域.这一举措可防止全局命名空间被污染. IIFE 还可确保你的代码不会轻易被其它全局命名空间里的代码所修改(i.e. 第三方库,window 引用,被覆盖的未定义的关键字等等). 不推荐 var x = 10, y = 100; // Declaring variables in the global scope is result

JavaScript严谨模式(Strict Mode)

下面的内容翻译自It’s time to start using JavaScript strict mode,作者Nicholas C.Zakas参与了YUI框架的开发,并撰写了多本前端技术书籍,在我看过关于JavaScript严格模式的入门介绍文章中,这篇是写得最好的. ECMAScript5中引入的严格模式,通过让JavaScript运行环境对一些开发过程中最常见和不易发现的错误做出和当前不同的处理,来让开发者拥有一个”更好”的JavaScript语言.很长一段时间内,由于只有Firefo

JavaScript之严格模式 &quot;use strict&quot;;

严格模式就是在代码片段的顶部加上一个字符串常量的语句"use strict";(也可以用单引号),它可以是全局的,也可以是局部的(function和eval两种局部作用域).但是它必须是代码的第一个语句(未必要是第一行).在它之前如果有任何语句(包括空语句),严格模式的声明就会失效. "use strict";//全局严格模式function func(){ "use strict"; //局部严格模式};eval('"use stri

浅析JavaScript中Function对象(二) 之 详解call&amp;apply

函数是js中最复杂的一块内容,其中call() 和 apply()又是重灾区,初学者往往在这个坑里栽倒,这次来分析这2个函数对象的成员 一.函数的角色 在js的体系下,js有3种角色.分别是普通函数.构造器.对象. 1.普通函数 <script type="text/javascript"> function f1(){ console.log('这是个函数'); } </script> 这里声明的f1,它的角色就是个普通函数 2.构造器 <script