Q1:到底使用单引号还是双引号
在js的代码中主要使用的是单引号,而在HTML和CSS中使用双引号。为了区分,我们js尽量使用单引号。
当然单双引号本无对错,都是可以使用的。
Q2:什么时候需要使用引号
变量是不用引号的,在js中只有字符串需要用引号。
1.在创建对象的时候
var obj ={
username:'张三疯',
age:18,
sex:'男',
sayHi:function () {
console.log('Hi~')
}
}
注意这是用键值对的方法创建的对象,中间是用逗号分隔!也不需要用var哦,中间用冒号赋值。
如果赋的值是字符串的话,就会用引号框起来。
当我们调用属性的时候:
console.log(obj.age);
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页面里的所有元素都是对象。
-
element.属性;
本来就有的属性用这种,比如img.src -
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>
- 在参数中用引号括起来的代表可执行的代码!
- fun()表示直接执行fun()函数,把这个放在定时器里几乎是没有用的,因为代码到这里就会直接执行fun(),并不会等1s。而1s以后setInterval调用就会报错 。
- 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()'
的执行环境是全局的,也就是说会去全局的环境里找它。但是全局的里面并没有定义这个函数,所以就会出现错误。