Q1:到底使用单引号还是双引号

在js的代码中主要使用的是单引号,而在HTML和CSS中使用双引号。为了区分,我们js尽量使用单引号。
当然单双引号本无对错,都是可以使用的。

Q2:什么时候需要使用引号

变量是不用引号的,在js中只有字符串需要用引号。

1.在创建对象的时候
var obj ={
	username:'张三疯',
	age:18,
	sex:'男',
	sayHi:function () {
		console.log('Hi~')
	}
}

注意这是用键值对的方法创建的对象,中间是用逗号分隔!也不需要用var哦,中间用冒号赋值。
如果赋的值是字符串的话,就会用引号框起来。
当我们调用属性的时候:

  1. console.log(obj.age);
  2. console.log(obj['age'];

注意第二种调用要把age用引号框起来的哦。我们可以把它想象成一个数组,因为采用的是键值对的方式,所以我们根据age就可以找到对应的值啦,age就相当于一个索引,所以要用引号框起来。

2.写构造函数的时候是不需要引号的

写一个构造函数,注意开头必须是大写的!

function Star (uname,age,sex){
	this.uname=uname;
	this.age=age;
	this.sex=sex;
	this.sing=function(song) {
	console.log(song);
	}
}

当我们调用的时候:

var ldh=new Star('刘德华',18,'男‘);
ldh.sing('冰雨');

这里就印证了前面讲的,变量不需要括号(形参也相当于变量),而真正的字符串是需要括号的。

3.在Dom获取元素时

在我们获取元素的时候常用document.getElementById('') 这一对引号之间就是我们id的名称,也就是说这个函数的参数是一个大小写敏感的字符串。

4.在调用元素属性值时

和调用对象的属性值是一样的,因为在dom中整个HTML页面里的所有元素都是对象。

  1. element.属性;本来就有的属性用这种,比如img.src
  2. element.getAttribute('属性');这种用于用户自定义的。
5.在注册事件时

EventTarget.addEventListener(type, function(){}) 这里的type就是表示监听事件类型的字符串。要用引号框起来。比如‘click’。

Q3:定时器setInterval中第一个参数加不加引号(重点)

<script >
      function fun() {
            alert(1);
        }
        setInterval('fun()',1000);//全局作用域下正常执行
        setInterval(fun(),1000); //调用函数正常,setInterval调用出错
        setInterval(fun,1000);  //正确
</script>
  1. 在参数中用引号括起来的代表可执行的代码
  2. fun()表示直接执行fun()函数,把这个放在定时器里几乎是没有用的,因为代码到这里就会直接执行fun(),并不会等1s。而1s以后setInterval调用就会报错 。
  3. fun不加括号表示这个函数的引用,所以第三个相当于直接把fun函数里的内容全部搬进来了,和直接写匿名函数的效果是一样的!

我们主要解释一下为什么 setInterval(‘fun()’,1000);在window.onload函数中不能执行

window.onload = function () {
            function fun() {
                alert(1);
            }
             setInterval('fun()',1000);//这个报错了 未定义   重点在这一个
            // setInterval(fun(), 1000); //这个和刚才全局的表现一样
           // setInterval(fun,1000);//这个没有问题           
        };

我们知道,JavaScript有一个预编译处理,首先对函数和变量进行预编译,也就是说把对全局变量的定义(不是赋值)以及函数的声明放到最前面,即函数和变量作用域是在其声明的时候确定的,而不是在执行的时候确定。
但是JavaScript存在作用域链,简单的来说就是fun()函数是定义在window.onload = function ()这个函数里面的,在预编译的时候不会把fun()函数的申明前置。
而我们最后执行 setInterval("fun()",1000);的时候'fun()'的执行环境是全局的,也就是说会去全局的环境里找它。但是全局的里面并没有定义这个函数,所以就会出现错误。