zoukankan      html  css  js  c++  java
  • [译]JavaScript写的一个quine程序

    原文:http://www.2ality.com/2012/09/javascript-quine.html


    引用自Wikipedia:

    一个quine是一个计算机程序,它不接受任何输入,且唯一的输出就是自身的源代码.

    @cowboy (Ben Alman) 给出了一个用JavaScript写的quine程序:

    !function $(){console.log('!'+$+'()')}()

    为什么这个quine能成功运行呢?

    获得源代码

    如果一个程序仅是由一个函数组成的,那么我们很容易获得这个函数的源代码:在大多数JavaScript引擎中,将一个函数转换成字符串就会返回它的源码.

    > function foo() { return "abc" }
    
    > String(foo)
    'function foo() { return "abc" }'

    输出自身源码的函数表达式

    我们的quine最开始是这样的:

    function $() { console.log(String($)) }

    这是一个函数声明,函数名为$(合法的JavaScript标识符).我们需要把它改写成为一个函数表达式.像这样:

    var prog = function $() { console.log(String($)) };

    等号右边是一个命名的函数表达式.函数名$只在函数内部才能访问到(译者注:作者忽略了旧版IE).调用这个函数后会发现,它已经是一个很接近quine的程序:

    > prog()
    function $() { console.log(String($)) }
    undefined

    在调用函数之后,控制台会显示出函数的输出,以及函数的返回值undefined.

    立即调用函数表达式(IIFE)

    现在我们有了一个用单个函数写成的程序.但我们不想延迟它的执行,我们想让它立即执行.JavaScript允许你创建一个函数表达式的同时就立即调用这个函数.这种写法称之为立即调用函数表达式(Immmediately Invoked Function Expression)(IIFE, 发音为“iffy”,译者注:亦非). 顺便说一句,这个术语也是由Alman发明的.把我们的程序改写成IIFE之后是这样的:

    > !function $() { console.log(String($)) }()
    function $() { console.log(String($)) }
    true

    一元非运算符(!)让JavaScript把这个函数解析成为一个函数表达式.否则,我们不能立即执行它 [1]. true是这个函数返回值取反后的结果:!undefined.

    添加缺少的字符

    我们的输出还缺少一些字符:函数表达式前面的叹号!以及后面的括号.可以这样加上它们:

    > !function $() { console.log('!'+$+'()') }()
    !function $() { console.log('!'+$+'()') }()
    true

    IIFE的另一种写法

    你还可以用小括号来括住一个IIFE:

    (function $(){console.log('('+$+'())')}())

    函数表达式之前的左括号和之后的右括号在源码中都出现了两次,所以使用感叹号可以给我们省出两个字符.

    参考

    1. [译]JavaScript中:表达式和语句的区别
  • 相关阅读:
    背景图片填充问题
    a:hover 等伪类选择器
    jQuery中animate()方法用法实例
    响应式框架Bootstrap
    HTTP入门
    jQuery选择器
    httplib urllib urllib2 pycurl 比较
    校招
    JAVA描述的简单ORM框架
    Roman to Integer
  • 原文地址:https://www.cnblogs.com/ziyunfei/p/2709428.html
Copyright © 2011-2022 走看看