JavaScript 比较 Day8

来源:互联网 发布:杭州阿里云公司地址 编辑:程序博客网 时间:2024/06/06 02:49
// var sb = function(){

//    alert(this);//this指向window
// }
// sb();


//最简单的闭包例子,一般来说函数执行完,函数一切都会被销毁释放内存(出栈)
//闭包子函数使用复函数的a,执行完复函数,返回一个子函数发现有引用父函数的
//变量a,所以不释放函数变量a,所以闭包会一直占据内存容易造成内存泄漏

// function father(a){
// return function(){
// alert("hello"+a);
// }
// }
// var f = father("son");
// f();


// function  test(a){
// this.r=a; //this指向window,此时r为window全局环境对象的属性也就是r为全局变量
// }
// test("mabi");
// alert(r);
// alert(window.r);
// alert(window["r"]);
// alert(this.r);
//以上全部弹出mabi


//要注意全局变量的使用,可能与引用的第三方脚本的全局变量同名造成无法估测的错误,尽可能用var声明的局部变量
//如下反例易错(勿使用):
// function test(){
// // var a =b=5; //此时a为局部变量而b未声明就使用为全局变量(这个错误比较隐秘)
// var a=5,b=5;//这个才是正确的a,b都为局部变量
// }
// test();
// alert(b);


//全部变量分为两种 一种:显示用var声明的全局变量,另一种是没用var声明就直接
//拿来使用的隐式全局变量
//* 显示全局变量是不能被删除的
//* 隐式全局变量是能被删除的
//这表明在技术上,隐式全局变量并不是真正的全局变量,但他们是全局对象的属性
//因为变量是不能删除的,而属性是能删除的;且看一下例子:
// var a=1;
// b=2;
// (function test(){
// c=3;
// })()
// alert(delete a);//false
// alert(delete b);//true
// alert(delete c);//true
// alert(typeof(a));//number
// alert(typeof(b));//undefined 说明删除成功
// alert(typeof(c));//undefined


//匿名函数
// (function(){
// alert("我是匿名函数");
// }())


// (function(){
// alert("我是匿名函数1");
// })()


//(function(){}()) 或者(function(){})() 这两个都是表示匿名函数一加载就马上执行代码
//()必不可少,有他才会立即执行
//不需要按照常规通过函数名调用(例如常规需要function test(); test())
//并且这样做的好处是不会污染全局变量,如果不用这种方式我们要一加载就执行某段代码,肯定是
//放到函数外面 类似 <script> var a=10 ; alert(a)<script> 一加载就执行弹出a,这样有可能污
//第三方引入的全局变量。  下面的例子 使用(function(){})() 形成闭包,这样就可以得到我们
//想要的值0,1,2, 其实等价于 function test(i){};test(i),  如果没有这种形式,每次弹出的是3
//因为当我们触发点击事件的时候已经遍历完了此时 i的值为3,无论点击哪个radio都是3,
//使用(function(i){})(i) ,rads[i]引用了外部函数的I,形成闭包,这样不会立即释放变量i

// window.onload=function(){
// var rds=document.getElementsByName("s");
// for (var i =0; i <rds.length; i++) {
// (function(i){
// rds[i].onclick=function(){
// alert(i);
// }
// })(i)
// }
// }

// window.onload=function(){
// var rds=document.getElementsByName("s");
// for (var i =0; i <rds.length; i++) {
// (function(i){
// rds[i].onclick=function(){
// alert(i);
// }
// }(i))
// }
// }


// JavaScript中,你可以在函数的任何位置声明多个var语句,并且它们就好像是在函数顶部声明一样发挥作用,这种行为称为 hoisting(悬置/置顶解析/预解析)。当你使用了一个变量,然后不久在函数中又重新声明的话,就可能产生逻辑错误。对于JavaScript,只 要你的变量是在同一个作用域中(同一函数),它都被当做是声明的,即使是它在var声明前使用的时候。看下面这个例子:

// 反例
// myname = "global"; // 全局变量
// function func() {
//     alert(myname); // "undefined"
//     var myname = "local";
//     alert(myname); // "local"
// }
// func();


//for-in循环应该用在非数组对象的遍历上,使用for-in进行循环也被称为“枚举”。
// var a="abd";
// var b=[2,5,9];
// for(var i in b ){
// alert(b[i]);
// }
// for(var i=0;i<a.length;i++){
// alert(a[i]);
// }
// var man={
// name:"jack",
// age:28,
// sex:"male"
// }
// for(var i in man){
// alert(man[i]);
// }

//避免隐式类型转换
// var zero=0;  
// alert(zero==false);//true
// alert("11"==11);//true


//全等式不会使用隐式转换(必须类型和值都相等)
// var zero=0;
// alert(zero===false);//false
0 0