• HOME
  • DOCS
  • WTF
  • TECH
  • LIFE
  • PAGES
    • ARCHIVE
    • TAGS
    • ABOUT
    • FRIENDS
    • RSS
  • TOOLS
    • GEO
    • RANDOM()
    • GOO.GL
    • CSS HEART
Aj's Blog

记录时间溜走的瞬间和折腾过的那些事

Javascript变形的应用: “(function(){})()” / 定义并执行函数 / js压缩 / js保护

2011-03-17  TECH  

一、“(function(){})()”的功能

功能描述:定义一个函数对象并执行。
返回值:该代码段返回定义的函数对象的执行结果。
这个写法到底是什么意思呢?
首先我们把代码分为2个部分:”(function(){})” 和 “()”
“(function(){})”的功能:定义一个函数对象。
“()”:执行函数并返回结果。
下面我们来逐步分析这种写法。

二、“(function(){})()”的分步解析

首先尝试理解以下2种描述:
1、定义一个函数a,返回固定值1;
对应的javascript代码片段:
function a()
{
  return 1;
}
2、定义一个对象a,该对象为函数对象,函数功能返回固定值1;
对应的javascript代码片段:
var a = new Object();
a = function(){
    return 1;
};
简化写法:
var a = function(){
    return 1;
};
进一步简化
var a = function(){return 1};
3、有上可以了解到
var a = function(){return 1};
实现的是定义一个变量a,a为一个对象,确切说是一个函数对象,返回固定值1;
一个简单的问题如何调用a?
当然是:a()
那如果”a = function(){return 1}”,a的调用又怎么写?
“function(){return 1}” + “()” 即: (function(){return 1})()
为什么函数定义部分加个”()”?
其实这个”()”没有特殊含义,只是把函数对象作为一个整体。
如果不加”()”那么 就是”function(){return 1}()”这明显是一个语法错误。

三、其他变形写法

原始写法: var a = function(){return 1}; a();
变形写法1:(function(){return 1})();
变形写法2:[function(){return 1}][0]();
变形写法3:{e:function(){return 1}}.e();
变形写法4:{e:function(){return 1},GhasyBHATsv:””,GbBVahsXz:””}.e();
其他写法:
随便你自由发挥 完全可以写成变形金刚

四、变形写法的用途

1、压缩js代码:
典型应用 jQuery.mini
http://www.google.com/search?q=jQuery.mini
2、定义并执行:
典型应用 “分享到…” 一遍用法为把一段JS添加到收藏夹,看到合适的页面 只要点以下该收藏 即可。
分享到豆瓣:
javascript:void(function(){var d=document,e=encodeURIComponent,s1=window.getSelection,s2=d.getSelection,s3=d.selection,s=s1?s1():s2?s2():s3?s3.createRange().text:”,r=’http://www.douban.com/recommend/?url=’+e(d.location.href)+’&title=’+e(d.title)+’&sel=’+e(s)+’&v=1′,x=function(){if(!window.open(r,’douban’,'toolbar=0,resizable=1,scrollbars=yes,status=1,width=450,height=330′))location.href=r+’&r=1′};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})()
3、复杂化js代码
这个算是js的保护手段之一,想想如果把压缩后代码读懂得累死的脑细胞吧。。
一些参考资料:

http://bonsaiden.github.io/JavaScript-Garden/zh/

https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference

下一篇:   2011-03 @ MY
上一篇:   MD5科普(二):MD5算法详解/如何改进MD5算法?
暂无评论

Cancel reply