拾遗 HTML中disabled和readonly的区别

共同点:作用是使用户不能够更改表单域中的内容.

区别:
1Readonly只针对input和textarea有效,
   disabled对于所有的表单元素有效(包括select,radio,checkbox,button…)

2、在表单元素使用了disabled后,我们将表单以POST或者GET的方式提交的话,这个元素的值不会被传递出去,
   readonly会将该值传递出去(一句话disabled:说你不行你就不行,行也不行)

disabled,readonly常用情况:

1、在某个表单中为用户预填了某个唯一识别代码,不允许用户改动,但是在提交时需要传递该值,
此时将属性设置为readonly

2、当用户正式提交了表单后需要等待管理员的信息验证,不允许用户再更改表单中的数据,而是只能够查看,
由于disabled的作用元素范围大,所以此时应该使用disabled,但同时应该注意的是要将submit buttondisabled掉,
否则只要用户按了这个按钮,如果在数据库操作页面中没有做完整性检测的话,数据库中的值会被清除。

3、在用户按了提交按钮后,利用javascript将提交按钮disabled掉,可防止在网络条件比较差的环境下,
用户反复点击提交按钮导致数据冗余地存入数据库

qusetion_1

<script>
    (function(){
        var a=b=1;
    // 给未声明的变量赋值,此变量就变为全局变量,严格模式下不可以这样声明
    // 因为赋值给a,b=1,是不存在的,var a=b=1,就可以等同于,b=1;var a=b;
        })()
    console.log(b);
    console.log('b defined?'+(typeof b !=='undefined'));
    console.log('a defined?'+(typeof a !=='undefined'));
   script>

qusetion_2

<script>
   var  myObject ={
        foo:'bar',
        func:function(){
            var self=this;
            console.log(this.foo);//bar
            console.log(self.foo);//bar
            (function(){
            console.log(this.foo);//undefined
            console.log(self.foo);//bar
            }())
        }
    }
    myObject.func()
// 方法/函数是由谁(对象) 调用 的,方法/函数内部的 this 就指向谁(该对象);
//注意:被谁调用,不是处于谁的作用域,即使在作用域
//1、func是由myObject调用的,this指向 myObject。
//2、self指向myObject,相当于 myObject的this的副本。

//3、这个立即执行匿名函数表达式(IIFE)是由window调用的,this指向 window 。
//4、IIFE的作用域处于myObject.func的作用域中,本作用域找不到self变量,沿着作用域链向上查找self变量,
找到了指向 myObject对象的 self。
   script>

qusetion_3 关于闭包与for循环的理解

function createFunction1(){
     for(var i=0;i<5;i++){
       function s(){
         console.log(i);
       }
       s();
     }
   }
createFunction1();   //0 1 2 3 4;
以上是一个正常的函数。
 function createFunction2(){
     for(var i=0;i<5;i++){
       setTimeout(function timer(){
         console.log(i);
       },i*1000);
     }
   }
createFunction2();  //每隔1秒输出‘4’、共输出5次

并不会按照我们预想的每隔1秒分别输出0、1、2、3、4
原因:
此函数在for循环的第一层是setTimeout函数,他的执行和createFunction1中的s函数一样,
将按分别在1秒后、2秒后、3秒后执行。但这儿需要注意的是,setTimeout的内部函数timer并没有立即执行,
for循环中的i将会把值分别赋给setTimeout外部参数中的i,但其内部函数timer()则只会引用包含函数
setTimeout()中的变量的最后一个值。因为闭包所保存的是整个变量对象,而不是某个特殊的变量。
当然其中的这些处理变化,
都是瞬间完成的,与执行时间并无关系,即使把1000改成0效果还是一样的。
重写这个函数:


 function createFunction3(){
     for (var i=0;i<5;i++){
       (function(j){
            setTimeout(function timer(){
            console.log(j);
           },i*1000);
       })(i);
     }
   }
createFunction3();   //每隔1秒分别输出0 1 2 3 4
再看上面这个例子,给外部包装了一个立即执行的匿名函数,setTimeout里面的匿名函数不再引用外部函数的参数,
而是直接引用外部匿名函数的参数,这时,一切就会按照我们预想的来执行了。

“use strict”

设立"严格模式"的目的,主要有以下几个:
 - 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为
  在正常模式中,如果一个变量没有声明就赋值,默认是全局变量。严格模式禁止这种用法,全局变量必须显式声明。

"use strict";

  v = 1; // 报错,v未声明

  for(i = 0; i < 2; i++) { // 报错,i未声明
  }//因此,严格模式下,变量都必须先用var命令声明,然后再使用。
  - 消除代码运行的一些不安全之处,保证代码运行的安全;
  禁止this关键字指向全局对象
  function f(){
    return !this;
  }
  // 返回false,因为"this"指向全局对象,"!this"就是false

  function f(){
    "use strict";
    return !this;
  }
  // 返回true,因为严格模式下,this的值为undefined,所以"!this"为true.

因此,使用构造函数时,如果忘了加newthis不再指向全局对象,而是报错。
-----------------------------------------------------------
  function f(){
    "use strict";
    this.a = 1;

  };
  f();// 报错,this未定义2)禁止在函数内部遍历调用栈

  function f1(){

    "use strict";
    f1.caller; // 报错
    f1.arguments; // 报错

  }
  f1();

  - 提高编译器效率,增加运行速度;
  - 为未来新版本的Javascript做好铺垫。
  参考链接:[use strict](http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html)

你可能感兴趣的:(javascript,拾遗,前端-面试)