2010-05-30 2 views
5

Это код отслеживания для Google Analytics:Какова роль скобок в следующем фрагменте кода?

var _gaq = _gaq || []; 
_gaq.push(["_setAccount", "UA-256257-21"]); 
_gaq.push(["_trackPageview"]); 

(function() { 
var ga = document.createElement("script"); ga.type = "text/javascript"; ga.async = true; 
ga.src = ("https:" == document.location.protocol ? "https://ssl" : "http://www") + ".google-analytics.com/ga.js"; 
var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(ga, s); 
})(); 

Вы можете видеть, что функция находится внутри скобок.

Почему вы так думаете?

ответ

11

Это анонимная функция, которая определяется и вызывается немедленно. Он не может быть вызван извне, поскольку он не имеет имени. Все переменные внутри будут привязаны к анонимной функции. Это можно использовать для выполнения некоторой обработки в глобальной области без добавления в нее новых членов.

+0

Ну, функция без имени может быть вызвана, если вы присвоите ее переменной, а затем вызовите ее с использованием этой переменной (она все еще анонимная функция, просто хранится в переменной, которая имеет имя). – jasonmp85

+0

@ jasonmp85, wrong, foo = function() {}; имеет ту же семантику, что и функция foo() {}, только другой синтаксис. –

+0

@teehoo Я ничего не говорил об обратном – jasonmp85

2

Это так называемый lambda function. Как вы можете видеть, у него нет имени и его немедленно вызывают, используя скобки в конце строки.

+0

Я не эксперт по javascript, но зачем ставить этот код в лямбда-функцию вместо того, чтобы просто вставлять ее прямо? – Onots

+1

Чтобы предотвратить переписывание переменных любым другим JS-кодом. – halfdan

+4

Переменные, которые перезаписываются, на самом деле не проблема - они просто пытаются избежать «загрязнения» глобального пространства имен. – James

Смежные вопросы