Note:
含记名不记名网友问题
& chatgpt
1 回顾浏览器的进化路线,你认为推动浏览器发展的主要动力是什么? [一个角度来说,最大动力就是chrome的出现。曾经的IE像极了诺基亚,chrome就像是横空出世的iPhone ,当着IE的面告诉IE,浏览器应该这么玩儿。 另一个角度也是互联网的发展需要,人们所需要的不再是只是简单展示个页面的浏览器,需要有复杂的交互,浏览器应该能做更多的事情,这对浏览器的稳定性、以及性能都有了新的要求。所以出来一个性能符合要求的浏览器也是必须的。 还有就是11年后相对规范的es5的出现,再之后es6.7,web能做的事情越来越多了,web工程化,再后来node的出现,前端体系越来越庞大] 2. 07 | 变量提升:JavaScript代码是按顺序执行的吗? 1.老师好,请教您一个问题。
debugger; (function(){ console.log(g) if(true){ console.log('hello world'); function g(){ return true; } } })();
这个函数步进调试时,发现打印g时值是undefined而不是提示not defined,说明if中g函数确实是提升了,但是为何不是g()而是undefined?然后走完function g(){ return true; }这一步后 console.log(g)中的g才变为g()。这里条件声明函数的变量提升有点搞不明白。 作者回复: ES规定函数只不能在块级作用域中声明,
function foo(){ if(true){ console.log('hello world'); function g(){ return true; } } }
也就是说,上面这行代码执行会报错,但是个大浏览器都没有遵守这个标准。 接下来到了ES6了,ES6明确支持块级作用域,ES6规定块级作用域内部声明的函数,和通过let声明变量的行为类似。 规定的是理想的,但是还要照顾实现,要是完全按照let的方式来修订,会影响到以前老的代码,所以为了向下兼容,个大浏览器基本是按照下面的方式来实现的:
function foo(){ if(true){ console.log('hello world'); var g = function(){return true;} } }
这就解释了你的疑问,不过还是不建议在块级作用域中定义函数,很多时候,简单的才是最好的。 2. ES6 在附录B里面规定: 1.允许在块级作用域内声明函数。 2.函数声明类似于var,即会提升到全局作用域或函数作用域的头部。 3.同时,函数声明还会提升到所在的块级作用域的头部。
这里的表现应该是这样: function foo(){ var g1; if(true){ function g2(){return true;} console.log('hello world'); g1 = g2; } }
g1和g2表示引用不一样,这里是同名关系,但是所在的变量作用域是不一样的。 下面这个文章详细解释了。 https://juejin.im/post/5eaa8211e51d454de64e388e 3. 老师,可以请教下吗,在编译完成之后是单单生成了字节码,再到执行过程中变成对应平台的机器码? 还是编译过程已经生成了对应平台的机器码, 执行阶段就直接去执行相应的机器码? 作者回复: 先是生成字节码,然后解释器可以直接执行字节码,输出结果。 但是通常Javascript还有个编译器,会把那些频繁执行的字节码编译为二进制,这样那些经常被运行的函数就可以快速执行了,通常又把这种解释器和编译器混合使用的技术称为JIT 3. DOM API和BOM API
DOM(Document Object Model) 和 BOM(Browser Object Model) 是浏览器中用来操作网页的两个 API(应用程序编程接口)。
DOM API 是用于解析和操作 HTML、XML 等文档的 API,它提供了一个抽象层次结构来模拟文档的结构和内容。通过 DOM API,开发人员可以使用脚本将数据插入、修改和删除文档中的元素,以及遍历文档树、提取信息等。DOM API 主要由 JavaScript 语言提供,但也可以使用其他编程语言实现。
BOM API 是用于操作浏览器窗口和浏览器对象的 API,它提供了访问浏览器窗口、导航栏、状态栏、标签栏等的 API。BOM API 提供了与浏览器相关的操作,如打开新窗口、关闭窗口、切换标签页等。BOM API 主要由 JavaScript 语言提供,但也可以使用其他编程语言实现。
DOM 和 BOM 是浏览器中用来操作网页的两个重要 API,它们为开发人员提供了访问和操作网页的机制,从而可以更方便、更高效地编写网页应用程序。
DOM API 和 BOM API 都是由浏览器提供的 API,它们定义了浏览器中如何处理 HTML、XML 和其他文档,以及如何与浏览器窗口和浏览器对象进行交互。
JavaScript 语言作为浏览器脚本语言,也为 DOM API 和 BOM API 提供了实现和支持。开发人员可以使用 JavaScript 代码来操作 DOM 和 BOM,从而实现网页的交互和动态效果。
虽然 DOM API 和 BOM API 是由浏览器提供的,但 JavaScript 语言也可以为这些 API 提供更高级别的抽象和封装,以便开发人员更方便、更高效地使用这些 API。同时,JavaScript 语言也可以使用其他 API 来操作文档、窗口和其他浏览器对象,例如 HTML5 应用程序框架 (App Framework)。
让我来举一个例子来说明 DOM API 和 BOM API 是由浏览器提供的还是由 JavaScript 语言提供的。
假设我们要在网页中创建一个标签,可以使用 HTML 语言的 <tag> 元素,例如:
<tag>Hello World!</tag>
在这个例子中,我们使用 <tag> 元素来创建了一个标签,这个标签包含了一个文本节点。要创建这个标签,我们需要在 HTML 文档中使用 <tag> 元素。
但是,如果我们想要在 JavaScript 中创建这个标签,我们可以使用 DOM API 中的 createElement 方法。
例如:
const tagNode = document.createElement('tag');
在这个例子中,我们使用 createElement 方法在文档对象模型 (DOM) 中创建了一个名为 tag 的新标签节点。DOM API 提供了这个方法来创建新的元素节点,而这个节点可以包含文本、图像、链接等元素。
同样地,如果我们想要在 JavaScript 中创建浏览器窗口对象,我们可以使用 BOM API 中的 window.open 方法。例如:
const url = 'https://www.example.com'; const window = window.open(url);
在这个例子中,我们使用 window.open 方法创建了一个新窗口,这个窗口可以连接到 https://www.example.com 网址。BOM API 提供了这个方法来打开新窗口或切换现有窗口。
因此,虽然 DOM API 和 BOM API 都是由浏览器提供的,但 JavaScript 语言也为这些 API 提供了更高级别的抽象和封装,以便开发人员更方便、更高效地使用这些 API。
除了上述提到的 DOM 和 BOM API,还有一些重要的 API 不是由浏览器提供的。这些 API 是由操作系统或操作系统之上的更高级别抽象层提供的,它们可以让开发人员在桌面应用程序或移动应用程序中操作文件系统、访问摄像头、麦克风等硬件设备,以及进行系统级别的操作。
例如,Windows 操作系统提供了 API 来访问文件系统,Linux 操作系统也提供了类似的 API 来访问文件系统。这些 API 可以让开发人员编写桌面应用程序或移动应用程序,无需直接访问硬件设备或文件系统,而是通过更高级别的抽象层来实现。
此外,一些操作系统还提供了 API 来访问摄像头、麦克风等硬件设备,以及进行系统级别的操作,例如打开应用程序、关闭应用程序、调整音量等。
这些非浏览器提供的 API 可以让开发人员编写更加通用、灵活和可扩展的应用程序,同时也提高了应用程序与操作系统和其他硬件设备的交互能力。
... |