谷歌网站优化控制Javascript

谷歌网站优化控制Javascript,javascript,Javascript,有人能解释一下组成谷歌网站优化控制脚本的javascript吗?具体来说:前两行似乎是空函数,为什么第三个函数用括号()括起来 据我所知,这个脚本基本上编写了一个新的,它大概加载了一些用于a/B测试的内容 function utmx_section(){} function utmx(){} (function() { var k='0634742331',d=document,l=d.location,c=d.cookie; function f(n) { if(

有人能解释一下组成谷歌网站优化控制脚本的javascript吗?具体来说:前两行似乎是空函数,为什么第三个函数用括号()括起来

据我所知,这个脚本基本上编写了一个新的
,它大概加载了一些用于a/B测试的内容

function utmx_section(){}
function utmx(){}
(function() { 
    var k='0634742331',d=document,l=d.location,c=d.cookie;
    function f(n) {
      if(c) { 
        var i=c.indexOf(n+'=');
        if (i>-1) { 
          var j=c.indexOf(';',i);
          return escape(c.substring(i+n.length+1,j<0?c.length:j))
        }
      }
    }
    var x=f('__utmx'),xx=f('__utmxx'),h=l.hash;
    d.write('<sc'+'ript src="'+'http'+(l.protocol=='https:'?'s://ssl':'://www')+'.google-analytics.com'+'/siteopt.js?v=1&utmxkey='+k+'&utmx='+(x?x:'')+'&utmxx='+(xx?xx:'')+'&utmxtime='+new Date().valueOf()+(h?'&utmxhash='+escape(h.substr(1)):'')+'" type="text/javascript" charset="utf-8"></sc'+'ript>')
  }
)();
函数utmx_section(){}
函数utmx(){}
(函数(){
var k='0634742331',d=document,l=d.location,c=d.cookie;
函数f(n){
如果(c){
变量i=c.indexOf(n+'=');
如果(i>-1){
var j=c.indexOf(“;”,i);

return escape(c.substring(i+n.length+1,j在匿名函数中它首先缩短文档名和其中的cookie,函数
f(n)
获取名称下的值
n
。然后谷歌读取cookie,并借助
d.write
加载脚本(我看到它们与谷歌分析相关)。这样就可以加载…实际上你一直都在加载这些脚本,Google只需要在url中添加一些额外的参数,所以这是通过这种方式完成的-将参数保存在cookie中,下次使用cookie再次获取脚本


最后回到前两行:)谷歌加载脚本后(执行
d.write
),有一些函数使用了
utmx
utmx\u节
,以及这些函数的定义,或者更确切地说是重写。我认为它们一开始是空的,只是因为另一个函数可以在其实际定义之前执行它,而空函数不会发生任何事情(并且没有JS错误),否则脚本将不起作用。例如,在第一次迭代之后,有一些数据用于对这些函数进行真正的定义,并且一切都开始起作用:)

前两个函数实际上是空的,以后可能会被重写。
第三个函数是一个匿名自动执行函数。括号是一个惯例,让您知道它是自动执行的。

“f”函数在文档的cookies中查找给定给它的值并返回它。然后,一个新的脚本标记被写入文档(并从服务器请求)将这些值作为其URL的一部分。

如果您试图删除自动执行函数周围的括号,您将收到一个语法错误;它们是使其成为有效表达式所必需的。谢谢您的回答,“自动执行”是什么意思?@Richard:this way
(function(){…})()
定义函数并执行它;这种方法用于为变量提供作用域;在您的代码示例中,像
k
d
这样的变量只存在于该函数内部,您不能在外部访问它们;而且您也不会在窗口对象中创建任何函数,就像这样做一样
函数f(){..};f()
-在窗口对象中创建命名函数,然后执行它。@Richard:-可能是这样helpful@Maxym:啊,好的,明白了。它是一个anon函数,执行时不需要先声明它,然后分两步执行。我可以理解为什么您可能想要一个不通过声明绑定到窗口或文档的函数,但是这对变量作用域没有什么区别,我认为:假设变量是用“var”声明的,那么它们的作用域就是函数的局部作用域,对吗?谢谢你的回答,非常有趣。