将zepto-core的源码下载下来,然后看到最外层的结构是这样的
![](image/577794e10b241.png)
首先`window.Zepto`和`window.$`都赋值了`Zepto`这个变量,`Zepto`是个自执行的匿名函数,看源代码的最后几行,匿名函数返回了`$`变量
```js
return $
})()
// If `$` is not yet defined, point it to `Zepto`
window.Zepto = Zepto
window.$ === undefined && (window.$ = Zepto)
```
而代码中有如下几行,证明`Zepto`最终是个函数。
```js
$ = function(selector, context){
return zepto.init(selector, context)
}
```
可以来测试一下,在运行zepto的页面中来验证
```javascript
console.log( typeof window.$ ); // 'function'
```
总结一下,简单写来,这个结构可以简单模拟成这样:
```javascript
var Zepto = (function(){
var $
// ...省略N行代码...
$ = function(selector, context){
return zepto.init(selector, context)
}
// ...省略N行代码...
return $
})()
window.Zepto = Zepto
window.$ === undefined && (window.$ = Zepto)
```
而且,在这里我们还可以看到,平常我们`$('p')`使用zepto的时候,最终顺藤摸瓜会执行到`$ = function(selector, context){`这个函数中(其中的内容可不深究),而`p`这个选择器也会传递给`selector`参数。这是我们下一节要讲述的内容。